【问题标题】:Prevent SIGALRM from interrupting waitpid()防止 SIGALRM 中断 waitpid()
【发布时间】:2016-05-02 16:57:42
【问题描述】:

我正在尝试将我的进程 waitpid() 设置为子进程,但也要每隔一段时间打印一些内容。

我目前的计划是安排itimerwaitpid(),处理SIGALRM 打印,并在waitpid() 完成时停止计时器。

我想不通的唯一部分是防止SIGALRM 中断waitpid()

我查看了手册页并没有看到任何标志。

想法?

【问题讨论】:

    标签: c signals waitpid setitimer


    【解决方案1】:

    如果waitpid() 返回-1 并且errno 等于EINTR,则重新调用waitpid()

    pid_t pid;
    
    while (((pid_t) -1) == (pid = waitpid(...)))
    {
      if (EINTR == errno)
      {
        continue;
      }
    
      ...
    }
    

    另外(至少对于 Linux)可以通过在安装信号处理程序时设置 SA_RESTART 标志来避免在接收信号时返回 waitpid()。有关更多信息,请参阅此处:http://man7.org/linux/man-pages/man7/signal.7.html

    【讨论】:

      【解决方案2】:

      要么你必须在调用waitpid()之前屏蔽信号,但是你的警报将被延迟直到解锁,或者你必须检查waitpid()返回值和EINTR的errno

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多