如何在linux中杀死进程下的单个线程?

Md.*_*man 13 linux kill thread

在此处输入图片说明

这些是数据包接收器进程的各个线程。有没有办法杀死任何单个线程?Linux 是否提供任何特定命令可以终止或向进程下的任何特定线程发送停止信号?

Chr*_*own 16

从更大的进程中杀死单个线程通常是非常危险的。该线程可能:

  • 正在修改与其他可能损坏的线程的某些共享状态
  • 持有一些永远不会被释放的锁,导致锁无限期地不可用
  • ...或任何其他可能导致其他线程出错的事情。

一般来说,在应用程序本身的管理和同步之外,杀死单个线程是没有意义的。

  • 这根本没有用。OP 要求 _how_ 杀死一个线程,而不是他们是否应该。 (7认同)

Bas*_*tch 12

您可能会使用tgkill(2)tkill在您的 C 程序中使用(您需要使用syscall(2)),但您不想使用. 从您的程序内部,您可以使用pthread_kill(3) - 这很少有用。

(我不完全知道tgkilltkill- 例如与SIGKILLSIGTERM- 对线程有什么影响)

并行线程(7)库使用低层次的东西(包括一些信号(7) -s和futex的(7) -S等等;另见NPTL(7) ),如果你生杀死(有tkilltgkill)部分单个线程,您的进程将处于某种错误状态(因此未定义的行为),因为某些内部不变量会被破坏。

因此,请研究数据包接收器程序的文档并找到其他方法。如果是自由软件,研究它的源代码并改进它。

更仔细地阅读signal(7)signal-safety(7)。信号旨在发送到进程(通过kill(2))并在线程中处理。

在实践中,信号和线程不能很好地结合。阅读一些pthread 教程

一种常见的伎俩,编码当一个多线程程序(和想要处理外部像信号SIGTERM)是使用管道(7)到自己的过程和调查(2)该管道在其他线程(你也可以考虑在Linux特定的signalfd(2) ),使用信号处理程序write(2) - 将一个字节或几个字节放入该管道。这个众所周知的技巧在Qt 文档中有很好的解释(即使没有 Qt,您也可以在自己的程序中使用它)。

  • 是的,`SIGKILL` 和 `SIGTERM` 信号被定义为终止或终止进程。无论哪个线程接收它们都是如此——它们仍然意味着同样的事情。在没有进程密切合作的情况下终止线程将是一次废话,并且可能对进程造成灾难性的后果。 (5认同)
  • `tgkill` 函数没有提供终止线程的方法。它向线程发送信号。它被命名为“kill”,因为它是杀死进程的历史方法,不能用于杀死线程。 (4认同)