APUE——信号

12 篇文章 0 订阅
11 篇文章 0 订阅

1.信号概念:信号是事件驱动的软件中断机制。每个信号名字都以三个字符SIG开头,在<signal.h>中被定义为正整数。

2.对信号所采取的动作有忽略(SIG_IGN)、按系统默认(SIG_DFL)、自定义信号捕捉函数三种处理方式。进程调用了 exec(3)家族函数执行程序时,原先设置为捕捉的信号都将改为按系统默认方式处理。而 fork(2)之后的子进程继承父进程设置的信号处理方式。

3.signal函数:用于注册一个信号处理程序。信号处理程序执行时,进程将自动阻塞被处理的信号,并在信号处理程序执行结束后恢复。

#include<signal.h>

void (*signal(int signo, void (*func)(int)));

4.系统调用的自动重启动问题:低速系统调用:指由于等待异步事件而可能会使进程出现永久性阻塞的系统调用。阻塞期间进程一旦递送了信号,则该系统调用会马上返回,并置 errno 为 EINTR。

5.可重入函数必须满足以下特征:使用的数据必须是非静态或非全局变量;不能返回静态或全局变量的地址;只能使用调用者传递的数据;不能使用单例对象资源的锁——这是针对面向对象机制而言的;不能调用不可重入函数。调用了 malloc(3)家族的函数及调用了标准 IO 库的函数都是不可重入的。因为它们都使用了公共的资源。

6.信号语义:产生信号是指某个事件发生时内核向相应进程发送一个信号。信号递送是指进程已经针对信号采取了三种动作中的一个。信号未决是指信号已产生但是没有递送。信号阻塞是指产生的信号无法被处理,如果这个信号的动作不是忽略,则处于未决状态。

7.SIGCLD语义:子进程状态改变后内核向父进程发送此信号,父进程需要调用一个wait函数以查看终止状态。kill函数将信号发送给进程或进程组,发送者必须是超级用户或发送者的实际或有效用户ID必须等于接受者的实际或有效用户ID。使用alarm函数可以设置一个计时器,超时时会产生SIGALRM信号。pause函数使进程挂起直至捕捉到一个信号。abort函数使内核产生一个SIGABRT信号并发送给调用进程。

8。信号集:

#include<signal.h>
int sigemptyset(sigset_t  *set);
int sigfillset(sigset_t  *set);
int sigaddset(sigset_t *set, int  signo);
int sigdelset(sigset_t  *set, int signo);
int sigismember(const sigset_t  *set, int signo);
上述函数分别清空一个信号集,填满一个信号集,将一个信号加入信号集,将一个信号从信号集中删除,测试一个信号是否在信号集中。

sigprocmask函数可以检测或更改一个进程的信号屏蔽字或同时完成这两个。sigpending函数返回调用进程的阻塞信号集。

9.sigaction函数用于检查或修改与指定信号想关联的处理动作。sigsuspend函数在一个原子操作中先恢复信号屏蔽字,然后使进程休眠以等待一个信号发生。

10.作业控制信号:对某一个进程产生 SIGSTOP、 SIGTSTP、SIGTTIN、SIGTTOU 信号使之停止执行时,如果有未决的SIGCONT 信号存在,则将被丢弃。反之亦然。对一个停止的进程产生一个 SIGCONT 信号时,不管该信号是否会被进程阻塞或忽略,都会使进程恢复执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值