LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 638|回复: 1

信号处理函数的问题

[复制链接]
发表于 2006-2-12 15:16:42 | 显示全部楼层 |阅读模式
有如下一段代码
  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);
}
发表于 2006-2-14 15:14:10 | 显示全部楼层
while (semop(XXX) < 0) {
    if (errno = EINTR)
         continue;
    XXXX
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表