Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534208
  • 博文数量: 103
  • 博客积分: 2024
  • 博客等级: 上尉
  • 技术积分: 1294
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 21:17
文章分类

全部博文(103)

文章存档

2012年(2)

2011年(21)

2010年(80)

分类: LINUX

2011-04-22 09:24:04

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进行信号的处理。
   
阅读(1329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~