c - 如何通过 ctrl+C 或 ctrl+Z 杀死父进程及其子进程

标签 c linux process signals

我的程序中有主进程 fork() 一些子进程,然后进入无限循环(此外,子进程是无止境的)。现在,我想终止所有进程,关闭套接字,取消附加共享内存,并在使用 Ctrl+C 终止程序时清除所有类似的东西Ctrl+Z。我在互联网上搜索,发现我可以通过发送一些信号(如 SIGSTOP 和 SIGINT)来做到这一点,但我不知道该怎么做。那么,我该如何在我的程序中实现这一点?

最佳答案

从程序外部,您可以使用 kill 向任何进程发送信号命令。

默认情况下,kill 将发送 SIGTERM 信号,这将终止进程并释放分配给它的资源。您可以使用 ps 命令查找程序进程的进程 ID。使用 CTRL-C 只会终止父进程。它不会杀死子进程。如果你只是 fork ,并没有执行一个新程序,那么你所有的子进程都将与父进程同名,这意味着你可以使用 killall命令一次性终止它们。如果您远程登录,那么注销将导致 SIGHUP 信号被发送到您在 session 期间生成的所有进程,这将默认终止它们。

在程序内部,有一个 kill()操作类似于命令的功能。您仍然需要进程 ID,因此您的父代码记住 fork 返回的子进程 ID 很重要。

关于c - 如何通过 ctrl+C 或 ctrl+Z 杀死父进程及其子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8566282/

相关文章:

c - 段错误(核心已转储)堆栈

c - RSA_private_decrypt 在 Windows 上导致内存泄漏

c - C 中的 "struct namespace"是否有技术原因?

linux - 授予 unix 进程对目录的独占 RW 访问权限

c - 如何从 C 中的 Unix 终端获取输入文件名?

python - 有选择地使用具有周期性输出的 bash 脚本输出来触发另一个脚本

python - 在单核上运行的 python 3.x/Windows 7 上的多进程 map-reduce

linux - 重播/返工 TCP 数据包(中间人)

module - Erlang中的模块和进程之间有什么关系

c - 为什么我的信号处理程序不处理 SIGKILL,有时会导致帐户注销