|
|
有如下一段代码
signal(SIGALRM, xxx);
xxxx
semop(xxxxx) /*wait一个信号量变成非0*/
xxx
当运行semop进入等待状态时,如果此时来了个SIGALRM信号,信号处理函数返回后就直接跳到semop后面的语句继续执行了。
查询过资料,尝试使用sigaction,将其中的sa_flags设置为SA_RESTART,据书上说时返回后会再启动被中断的系统调用。但是实际上并没有,不知道为什么?代码如下,我使用了这个safesignal代替原来的sinal,仍然不能恢复等待信号量
sighandler_t safesignal(int signo, sighandler_t func)
{
struct sigaction act, oact;
act.sa_handler = func;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
act.sa_flags |= SA_RESTART;
if (sigaction(signo, &act, &oact) < 0) {
debug(LOG_LEVEL_DEBUG, "register signal handler failed\n");
return (SIG_ERR);
}
return (oact.sa_handler);
} |
|