- 论坛徽章:
- 0
|
见apue-10.14 : SA_INTERRUPT
只有带这个选项的信号,可强制“系统调用不自动重启动”。
read接受到alarm信号后(我也测试了SIGINT), 信号响应后,依然会再进行read,程序“阻塞”在read。
程序改为:
#include <stdio.h>
#include <signal.h>
#include <string.h>
static
void handler(int sig)
{
printf("recv a sig=%d\n",sig);
}
int main()
{
char buf[1024];
int ret;
struct sigaction a;
signal(SIGALRM, handler);
memset(&a, 0, sizeof(a));
a.sa_flags = SA_INTERRUPT;
a.sa_handler = handler;
sigaction(SIGINT, &a, NULL);
alarm(3);
ret = read(0, buf, sizeof(buf));
if (ret == -1)
printf("interrupt by alarm signal\n");
return 0;
}
这样很明确可以测试: alarm将“阻塞”在read,而CTRL+C将导致退出。
本程序在ubuntu14.04 x86_64测试通过。
|
|