信号处理程序和waitpid共存

时间:2015-04-15 18:08:22

标签: c signals

我在C中编写了一个应该支持后台和前台进程的shell。

约束:

  • 终止的后台进程应由信号处理程序
  • 捕获
  • 没有全局变量可用于从信号处理程序进行通信
  • 没有允许进程/ pid列表

我的解决方案:

  • Waitpid,直到前台进程终止
  • 对于后台进程,请立即返回提示
  • Handler捕获SIGCHLD,其中waitpid用于清除进程表

问题:

  • 前台进程还会触发处理程序,导致两个waitpids中的一个发生错误
  • 在运行前台进程时忽略SIGCHLD无法解决,因为后台进程可能在此期间终止
  • 找不到让处理程序忽略特定pid的方法(前台进程已启动)

谢谢!

1 个答案:

答案 0 :(得分:0)

  

问题:

     
      
  • 前台进程还会触发处理程序,导致两个waitpid中的一个   错误
  •   

这不是问题 - 然后离开处理程序。

void handler(int signum)
{
    pid_t pid;
    while (pid = waitpid(-1, NULL, WNOHANG), pid > 0)
        fprintf(stderr, "%d terminated\n", pid);
}