【问题标题】:How to kill the parent process and its children on ctrl+C or ctrl+Z如何在 ctrl+C 或 ctrl+Z 上杀死父进程及其子进程
【发布时间】:2011-12-19 19:18:11
【问题描述】:

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

【问题讨论】:

  • ^Z 一般不会终止程序,只是暂停它,以便稍后继续。
  • 我想你已经大致得到了答案。有关向其他进程发送信号的系统调用,请参见 kill(2) 手册页:linux.die.net/man/2/kill 此外,您还需要阅读信号处理程序、引用的 sigaction 手册页,或者我强烈建议使用 libev,一种状态机器,在收到信号时调度代码。它可以保护您免于犯错。

标签: c linux process signals


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    当你的进程残酷退出时,所有资源肯定都被释放了。

    但是,如果您想控制行为(什么顺序等,我不知道是什么),那么您应该安装一个信号处理程序。见sigaction(2)

    【讨论】:

    • 共享内存是这些例外之一。必须将段标记为销毁,然后当该段的所有客户端退出时,释放内存。 linux.die.net/man/2/shmctl
    猜你喜欢
    • 2019-07-13
    • 2021-02-23
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多