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

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

在此输入图像描述

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

答案1

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

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

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

答案2

你可能会使用tgkill(2)或者tkill在你的 C 程序中(你需要使用系统调用(2)) 但你不想。从你的程序内部你可以使用pthread_kill(3)- 这很少有用。

(我完全不知道tgkillor tkill- 例如在线程上使用SIGKILLor - 会产生什么影响)SIGTERM

并行线程(7)库使用低级的东西(包括一些信号(7)-沙未来纺织(7)-s 等等……;也可以看看NPTL(7)),如果你原始杀死(用tkilltgkill)某个单独的线程,你的进程将处于某种错误的状态(所以未定义的行为)因为一些内部不变量会被破坏。

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

仔细阅读信号(7)信号安全(7)。信号旨在发送到进程(通过杀死(2))并在线程中处理。

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

一个常见的技巧,在编写多线程程序时(并且想要处理外部的像 ) 这样的信号SIGTERM是使用管道(7)到你自己的流程和民意调查(2)该管道位于其他线程中(您也可以考虑 Linux 特定的信号fd(2)),带有信号处理程序写(2)- 将一个或几个字节放入该管道中。这个众所周知的技巧在中得到了很好的解释Qt 文档(即使没有 Qt,您也可以在自己的程序中使用它)。

答案3

SIGKILL您可以为您知道未使用且不会被阻止/忽略的另一个信号安装一个处理程序,而不是发送(例如SIGSYS)。在此处理程序中,您可以调用- 与常规或函数syscall(SYS_exit, 0)相反,系统调用仅终止当前线程(LWP) - 整个进程将通过系统调用终止。exit(int)_exit(int)exitexit_group

您可能会考虑调用pthread_exit(...)而不是系统调用,但此函数不是异步安全的,因此调用它可能会导致进程出现段错误。

其他答案中有关强制终止线程的所有警告均适用。

相关内容