信号,用于通知进程发生了什么。
函数signal
处理信号的函数,可以选择SIG_DEF,默认 SIG_IGN忽略此信号
子进程终止
如果子进程终止,父进程不处理会导致子进程关闭的信号SIGCLD成为一个僵尸进程。但是如果选择SIG_IGN忽略这个信号就不会。
kill函数
只是给进程发送信号而已,不要从字面意思以为是kill进程
raise函数
给本进程发信号
alarm函数
到时间给进程发送SIGALARM信号
pause函数
进程挂起直到捕捉到一个信号
信号集
表示多个信号成为信号集
可以使用如下函数:
sigemptyset 清空
sigfillset 将所有信号加入信号集
sigaddset 加入一个信号到信号集
sigdelset 删除一个信号到信号集
sigismember 判断一个信号是否属于这个信号集
函数sigprocmask
屏蔽指定信号集,返回之前屏蔽的信号集。当屏蔽这个信号期间,如果这期间有这个信号过来,就会一直等待,直到这个信号不被屏蔽,会将这个信号触发一次。
int sigprocmask(int how, conset sigset_t *restrict set, sigset_t *restrict oset);
how:
SIG_BLOCK 增加阻塞
SIG_UNBLOCK 删除阻塞
SIG_SETMASK 信号屏蔽是set指向的值
set:
当前要设定的信号集
oset:
之前屏蔽的信号集
函数sigpending
返回一信号集,这些信号就是被阻塞的
函数sigaction
就是改进的signal,可以返回之前的处理方式。
int sigpending(sigset_t *set),通过set返回。
函数sigsetjmp siglongjmp
这个函数和setjmp logjmp功能类似,都是跳转函数。
只是当有信号发生的时候,在处理信号时,对当前信号的屏蔽的,并且在处理信号函数返回时把屏蔽的信号恢复。如果在处理信号时使用longjmp跳转,会导致不会把当前屏蔽信号恢复,所以使用siglongjmp来恢复屏蔽信号。
函数sigsuspend
int sigsuspend(const sigset_t *sigmask)
这是一个原子操作, 进程挂起,直到捕捉一个信号并且处理完,sigmask是设置屏蔽的信号。信号处理完之后恢复之前的屏蔽信号
abort函数
将SIGABRT信号发送给调用进程,异常终止。