【问题标题】:Signal handler and waitpid coexisting信号处理程序和 waitpid 并存
【发布时间】:2015-04-15 18:08:21
【问题描述】:

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

约束:

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

我的解决方案:

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

问题:

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

谢谢!

【问题讨论】:

    标签: c signals


    【解决方案1】:

    问题:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多