1,信号的作用提供一个异步事件的通知机制。如果按下Ctrl+C,终端驱动会产生一个SIGINT信号,发送给当前进程。进程对信号捕获后作相应处理。
2,信号的种类
trap -l
3, 信号的可靠性
早期的系统中信号发生时,信号处理函数会disable。需要在信号发生时手动设置,并且信号会发生丢失的现象,
linux系统中没有第一个问题,但信号还是没有经过排队。这在处理SIGCHLD信号时可能会有问题
4,信号打断系统调用
经常看到这样的代码
read:
count = read(fd, buf, len);
if(count < 0){
if(errno == EINTR)
goto read;
else
xxxx
}
在一些系统中,read一些慢速的系统调用可能被信号打断,而linux下则不会打断系统调用(why?),相当于设置了sigaction的SA_RESTART标志 。
5,信号处理中的临界区保护问题
信号是一个异步事件,需要考虑临界区的保护和调用函数的可重入性问题。一般来说,信号处理应尽可能的简单。
6,同步信号处理
1,2.6.27后 提供了signalfd系统调用为每一个信号处理函数建立fd,通过select统一管理
2,在信号处理函数中设置flag,在主循环中对flag进行检查。
7,信号屏蔽
可以通过sigprocmask显示屏蔽信号
当系统捕捉一个信号时,默认自动屏蔽此信号,但信号处理函数有可能被别的信号打断。
可以通过sigaction对信号处理时屏蔽的信号做设定。
8,信号与进程
fork后继承信号处理函数,因为copy了地址空间
但并不继承pending的信号,这应该属于进程的私有资源
9,信号与线程
线程共享地址空间,有其特殊性。除SIGALRM信号,其他信号并不保证送到哪个线程。所以单独设置信号屏蔽字是没有意义的。一个pthread_create之前设置信号屏蔽字,单独create一个线程调用sigwait进行信号的处理。
阅读(1319) | 评论(0) | 转发(0) |