关于 Linux 中 signal 函数信号处理的讨论

    内核版本是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环境高级编程》







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值