信号: SIGCHILD
Q:
1 : 该信号默认处理是忽略? 为什么需要显式的忽略?
2: 可移植的信号处理?
3: signal 函数和sigaction 函数的区别
4:可再入
5:
A:
1: 对于信号SIGCHILD 处理, 是在应用中处理的比较多的两个应用(SIGCHILD, SIGPIPE)
系统默认是忽略该信号的,如果要再捕捉该信号,参考《CSAPP》第八章。
总结: SIGCHLD信号是一个很特殊的信号, 在不同的系统中可能有不同的语意
SIG_DEF (忽略) 和SIG_IGN 在早期的系统中还是有区别的。 如果显式的设置为SIG_IGN, 子进程就可能不会产生僵尸进程。 《APUE》 10.3
2:我们不同的系统中,对信号处理函数signal的理解不一样(比如一个被中断的慢速系统调用是否重启或者永久放弃,在不同的系统中理解是不一样的),
如果我们使用SIGACTION函数, 这样可以明确的告诉系统是否重启慢系统调用。 尽量使用sigaction 函数,为了显式的阻塞信号,使用SIGPROCMASK系列函数
3:signal函数只是一次起作用,如果调用了signal函数,下次调用的时候,不能够确定他的信号的处理方式,因为如果signal函数改变了系统的默认处理方式,
下一次调用的时候可能又设置会默认处理方式了 ,而sigaction函数却是能够一直起作用的。 所以还是用sigaction比较好。 《apue》 第十章。
4:可再入函数 《 apue》上面说的非常清楚, 标志的I/0函数不是可载入函数, 还有就是errno是一个全局的变量, 在信号处理函数中最好首先保存, 最后还原 。
有以下3中情况函数不是可再如的。 A: 已知他们使用静态数据结构 B: 调用了malloc, free 。 C 他们是标志的I/0函数。
因为标准i/o库的很多实现都以不可再入的方式使用了全局数据结构。
现在重看, 写的不太清楚。 后面继续整理下 , 至少要逻辑清晰
本文深入探讨了SIGCHILD信号的默认处理及其显式忽略的原因,并对比了signal与sigaction函数的区别,解析了可再入函数的概念及注意事项。
1685

被折叠的 条评论
为什么被折叠?



