Waitpid被系统调用中断

问题描述:

我正在使用execve分叉子进程来运行命令。我安装和定义3个信号处理程序:SIGCHLD,SIGINT和SIGSTP如下:Waitpid被系统调用中断

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

为什么我得到这个?

+0

请显示完整的代码。如下所示的代码不会发出“* waitpid错误:中断的系统调用”*“ – alk

+0

'waitpid()'带着'WNOHANG'通过,预计不会因'EINTR'失败。 – alk

被中断的系统调用:

如果一个进程捕获的信号,而该过程是在一个“慢”系统调用块,则系统呼叫被中断。

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

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

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

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

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