信号处理程序和waitpid共存

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

约束:

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

我的解决方案

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

问题:

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

谢谢!

问题:

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

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

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