gpt4 book ai didi

c - 在 Ctrl-C 上终止父进程和子进程

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:55 24 4
gpt4 key购买 nike

我正在编写一个 C 程序,其中父进程 fork n 个子进程。子进程一旦创建就会调用 SIGSTOP 以允许创建其他子进程。创建所有 n 个子进程后,父进程向所有子进程发送一个 SIGCONT 信号。

所有子进程执行无限循环并使用信号量共享公共(public)资源。现在我希望每当用户按下 ctrl-c 时,父进程和所有子进程一起终止。然而,在终止子进程之前,应该在文件中更新每个子进程使用资源的次数。

例如:

Process 1 - 5 times
Process 2 - 3 times

等等。

在此实现方面需要帮助...

最佳答案

正式的信号处理函数应该尽可能少地做。 C 标准表示它可以写入 volatile sig_atomic_t 变量,或调用 abort()_Exit()(或者,有限制,信号())。 POSIX 允许更多的事情发生,而且您可能正在 Linux 上工作(尽管您没有这么说)。因此,您的信号处理程序会将 sig_atomic_t 变量的值从 0 更改为 1,以指示信号发生。

因此,您的子进程将循环。作为循环条件的一部分,您应该检查 sig_atomic_t 变量以查看子项是否应该终止。当它检测到信号发生时,它将停止循环,打开日志文件进行追加,将其信息写入该文件,然后退出。您可以在处理过程中的其他点检查 sig_atomic_t 变量,而不仅仅是主循环条件;那是你的决定。

请注意,您应该使用 sigaction() 而不是 signal() 来控制信号处理,并且您应该在处理信号时阻止中断。

总结一下:

  • 您的信号处理程序尽可能少。
  • 当调用信号处理程序并安排退出时,您的代码会在主循环中进行检测。
  • 您的代码还可以检测何时在其他方便的点调用了信号处理程序。
  • 您可以调用一个函数来进行日志记录并退出。

关于c - 在 Ctrl-C 上终止父进程和子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8855173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com