内核版本是Linux version 3.5.0-23-generic,
系统版本是Ubuntu 12.04.2,
编译工具是gcc version 4.6.3,以上是我所使用的开发环境。
在了解 signal 函数的过程中,发现运行程序后,进程处理信号后,就将对信号的响应配置为默认动作。源代码如下:
#include "apue.h"
static void sig_usr(int);
int
main(void)
{
int c;
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR1");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
err_sys("can't catch SIGUSR2");
for ( ; ; ) {
if ((c = getc(stdin)) != EOF) { /* 从进程标准输入中获取一个字符 */
if (c == 'r') { /* 输入字符为r,则向自身进程发送信号 */
if (raise(SIGUSR1) == -1)
err_sys("can't sent SIGUSR1");
}
}
}
}
static void
sig_usr(int signo)
{
if (signo == SIGUSR1) {
printf("received SIGUSR1\n");
}
else if (signo == SIGUSR2) {
printf("received SIGUSR2\n");
}
else {
err_dump("received signal %d\n", signo);
}
}
执行编译代码后生成的程序,往终端输入两次 r ,终端的输入输出如下所示:
r
received SIGUSR1
r
用户定义信号 1
但是很多资料说到这么一句:Linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。但是程序运行的结果跟理论是不一致的!
后来 man signal 指令来查看 signal 函数的说明,里面说到的意思大概是信号处理程序处理完传递进来的信号后,会将信号处理重新设置为SIG_DFL,也就是默认状态。当然,这是我也有可能是我内核版本低或者其他原因。因为水平有限,对待这类模棱两可的问题无法找出确切的答案,欢迎读者的指正。
参考资料:《UNIX环境高级编程》