使用sigaction信号捕捉函数问题

本文探讨了在使用sigaction处理SIGALRM信号时,getchar()函数返回-1并引发错误EINTR的问题。由于默认不设置SA_RESTART标志,系统调用在信号处理后不会自动重试,导致进程终止。设置SA_RESTART会使系统调用在信号处理后重新启动,避免程序结束。理解这一行为对于编写可靠的信号处理程序至关重要。
摘要由CSDN通过智能技术生成

当使用sigaction函数时,

不能使用getchar()阻塞进程,因为使用 `sigaction` 捕获信号后 `getchar()` 将从stdin流中读取到EOF,也就是返回了-1,所以进程会直接向下执行而终止。但是 `signal` 中则会一直阻塞在 `getchar()` 。

用sigaction只能捕捉一次SIGALRM的原因在于getchar被中断;

打印getchar的返回值为-1,perror打印其错误信息:Interrupted system call,对应的错误码为EINTR

在man文档第7章

man 7 signal

Interruption of system calls and library functions by signal handlers

If  a signal handler is invoked while a system call or library function call is blocked, then either:
 * the call is automatically restarted after the signal handler returns; or
 * the call fails with the error EINTR.

sigaction中的sa_flags未设置SA_RESTART所以会是第二种行为,系统调用被中断,下面有讲到read从终端读取数据是会被signal handler中断,getchar底层应该调用的是read。

如果在sa_flags中使用了SA_RESTART会导致系统调用重启,getchat不会被中断,这样程序不会结束,sigaction就可以一直捕捉SIGALRM。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值