【问题标题】:C Linux Signal Handler for the Main Process Only仅用于主进程的 C Linux 信号处理程序
【发布时间】:2017-09-09 19:58:49
【问题描述】:

我正在编写一个程序,它使用fork() 创建多个进程,然后调用exec 函数到同一个程序(这是教授要求的)。

我需要它对 CTRL+C (SIGINT) 做出反应并询问用户他/她是否想离开。问题是所有子进程也都实现了信号处理程序,因此,当发送信号时,用户必须回答与进程数相同的次数。

我只希望它在每个 CTRL+C 时询问用户一次。

我可以实施哪些解决方案?

【问题讨论】:

  • 先分叉,再设置信号处理?还是在孩子们,exec 之前,将信号处理程序设置为默认值?
  • fork() 生成的进程也会 fork(),因此无论哪种方式,它都会在(几乎)所有进程中安装处理程序。
  • 第一组子进程将知道它们是子进程,因此将沿着与第一个“主”进程不同的路径继续。如果他们不这样做,我会说你的设计似乎有缺陷。
  • 昨天你的同学asked about this。他提供了代码。

标签: c linux process signals handler


【解决方案1】:

当你调用fork()时,父进程会取回子进程的pid。当父级收到 SIGINT 信号时,您可以通过 kill 系统调用向子级发送 SIGTERM 或 SIGKILL 信号。

【讨论】:

  • 问题不在于如何给孩子们发送信号;是孩子们已经收到SIGINT,并且处理它的方式与OP想要的不同。
【解决方案2】:

您可以设置一个全局变量 pid 并在启动时使用 getpid() 的结果填充它。在信号处理程序中针对 pid 测试 getpid() 然后执行您的代码。比如,如果你是主进程,请继续,如果不是退出!

最终结果:您将拥有一个由主进程运行一次的信号处理程序......

【讨论】:

    最近更新 更多