Waitpid被系统调用中断

时间:2015-11-02 02:05:03

标签: c process fork sigchld

我正在使用execve分配子进程来运行命令。我正在安装和定义3个信号处理程序:SIGCHLD,SIGINT和SIGSTP,如下所示:

void sigchld(int sig)
{
while((pid=waitpid(-1,&stat,WNOTRACE|WNOHANG))>0)
{
  if(WIFEXITED(stat))
    //normal exit: Delete child from job list
  if(WIFSIGNALED(stat))
    //interrupted by signal: delete job from job list
  if(WIFSTOPPED(stat))
   //Stopped: put child in background
 }
}

//SIGINT Handler:
kill(-pid,sig)

//SIGSTOPPED Handler:
kill(-pid,sig)

现在,当我运行一个进程并将其放入循环(ctrl z)循环(100次)时,在大多数情况下我会收到错误:waitpid error: Interrupted system call

为什么我会这样?

2 个答案:

答案 0 :(得分:1)

中断系统调用:

如果一个进程在进程被阻塞的过程中发现了一个信号,那么该进程就会被阻塞。系统调用,然后系统调用中断。

问题是由于收到调用进程发送的信号,waitpid函数被中断。

waitpid是一个中断的系统调用。因此,系统调用中断的问题是我们现在必须明确处理错误返回。

您必须使用errno来处理waitpid中的错误。

中断系统调用意味着,例如,执行read语句,读取将从stdin读取输入,在读取之间有一个信号发生,现在系统必须处理那个信号,现在读取将是完成后,将errno设置为EINTR。

答案 1 :(得分:0)

我也有这个问题。当我注册我的处理程序时,我使用了一个sigaction处理程序,它看起来与这里的情况略有不同。就我而言,我没有包含SA_RESTART标志。包含此处理程序意味着系统调用将在中断时自动重新启动。