【问题标题】:sigkill doesn't terminate C programsigkill 不会终止 C 程序
【发布时间】:2016-03-05 23:21:12
【问题描述】:

我的印象是sigkill 总是有效?我的程序中有一个信号处理程序,当您按下 Ctrl-C 时会显示退出提示。这很好,但是当我通过命令行杀死时,我如何让它工作呢?现在 kill 命令什么也不做。我应该在我的代码中实现什么来使 kill 工作?

【问题讨论】:

  • ^C 不要发送SIGKILL。使用kill -KILL命令发送
  • 当您说“kill 命令什么都不做”时,您使用的命令到底是什么,相关进程到底发生了什么?

标签: c linux signals


【解决方案1】:

您不能为SIGKILL 设置信号处理程序。

您的进程没有机会回复SIGKILL。立即单方面终止;该过程无法进行任何清理。 O/S 释放分配给它的资源,就像它为任何其他死进程所做的那样。

请参阅 POSIX Signal Conceptssigaction() 和(尤其是)<signal.h> — 表示不能捕获或忽略 SIGKILLSIGSTOP


OTOH,你说“我怎么也能做到,所以当我通过命令行杀死它时它也可以工作”。你打算如何杀死它?假设你的 PID 在$pid,那么:

kill $pid

发送SIGTERM信号,你可以通过指定来控制发送哪个信号。 Control-C 键通常发送SIGINT,通常是信号编号2。从键盘发送的另一个信号是SIGQUITControl-\)或各种工作控制信号。

如果你使用:

kill -INT $pid

然后向进程发送中断(SIGINT)(kill -2 $pid 也是如此)。默认等同于kill -TERM $pid。您可以发送 SIGKILL 与以下之一:

kill -KILL $pid
kill -9 $pid

【讨论】:

    【解决方案2】:

    当您按下 control-C 时,会发送 SIGINT,您的程序可以捕获该信号。
    当您使用 kill 命令时,默认情况下会发送 SIGTERM,您的程序也可以捕获该命令。
    但是您的程序无法捕获或忽略 SIGKILL。那就是始终保证能够杀死甚至是行为不端的程序的那个。

    【讨论】:

      【解决方案3】:

      读取signal(7) & sigaction(2)kill(1)(用于命令)和kill(2)(用于系统调用)。

      默认情况下,SIGTERMkill 命令发送(例如,kill 1234 正在发送 SIGTERM,使用 kill(2),到 pid 1234 的进程)。当然,您可以在 kill 命令中给出明确的信号,例如kill -QUIT 1234。您可以通过安装适当的信号处理程序来捕获它(例如 SIGTERMSIGQUIT)。

      当然,你不能捕捉到SIGKILL(你可以用kill -KILL 1234 命令发送),所以你不能为它设置信号处理程序(即sigaction 会给出EINVAL 错误)。发送SIGKILL always 会杀死 -i.e.终止 - 接收目标进程(并且应该用于流氓进程)。

      关于 Ctrl C 是一个和tty-s相关的复杂的东西(一般是发送SIGINT信号)。阅读the tty demystified;等等...另见termios(3) & stty(1)

      在实践中,养成使用kill 进程的习惯,首先使用SIGTERM,然后使用SIGQUIT,最后使用SIGKILL。某些进程(例如数据库服务器)需要一些时间来将有用的状态保存到磁盘。所以不要一开始就使用kill -KILL(一些进程的内部文件可能有不一致的状态,给他们一个机会用“温和”的信号来管理)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-15
        • 2014-07-10
        • 2017-04-06
        • 1970-01-01
        • 2013-01-26
        • 2014-10-19
        • 1970-01-01
        • 2011-09-19
        相关资源
        最近更新 更多