信号处理函数的返回
*信号处理函数可以正常返回,也可以调用其他函数返回到程序的主函数中,而不是从该处理函数返回.
setjmp/longjmp
使用longjmp可以跳转到setjmp设置的位置.
我们可以在希望返回的位置使用setjmp,直接调用setjmp时返回0,当从longjmp返回时,setjmp的返回值是longjmp的第2个参数的值,可以利用这一点使多个longjmp返回到一个setjmp处.
sigsetjmp/siglongjmp
*避免信号被永久屏蔽
由于在信号处理期间自动屏蔽了正在被处理的信号,而使用setjmp/longjmp跳出信号处理程序时又不会自动将信号屏蔽码修改回原来的屏蔽码,从而被永久性屏蔽.
*区别:
与setjmp/longjmp唯一区别是sigsetjmp多了一个参数savesigs,如果savesigs非0,则sigsetjmp在env中保存进程的当前信号屏蔽字,在调用siglongjmp时会从其中恢复保存的信号屏蔽字.
信号的发送
*信号的发送主要由函数kill, raise, sigqueue, alarm, setitimer以及abort来完成.
kill函数
kill函数用来发送信号给指定的进程,执行成功返回0,当有错误发生时返回-1,错误代码存入errno中.
kill的行为和第一个参数pid的取值有关.
只有具有root权限的进程才能向其他任意进程发送信号,非root权限的进程只能向属于同一个组或同一个用户的进程发送信号
raise函数
参数sig表示要发送的信号编号,成功返回0,失败返回非0值.
sigqueue函数
支持信号带有参数,从而可以与函数sigaction配合使用.
sigqueue发送信号sig给进程pid.sigqueue在发送信号的同时支持携带参数,但是不能给一组进程发送信号.参数value是一个共用体.
函数执行成功返回0,表示信号被成功发送到目标进程.有错误发生时返回-1,错误码存入errno中.
alarm函数
可以用来设置定时器,定时器超时将产生SIGALRM信号给调用进程.
alarm只设定为发送一次信号,若要多次发送,则要对alarm多次调用.
如果之前已经调用过alarm,则返回之前设置的定时器剩余时间,否则返回0.
getitimer/setitimer函数
setitimer和alarm函数一样,也是用来设置定时器的,因此会相互影响.
setitimer函数详细用法
第一个参数which用来指定使用哪一个定时器.
abort函数
用来向进程发送SIGABRT信号.无返回值.