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


13

在此处输入图片说明

这些是Packet Receiver进程的各个线程。有没有办法杀死任何单个线程?Linux是否提供了可以杀死进程中的任何特定线程或向其发送停止信号的任何特定命令?


您的Packet Reciever程序是什么?(我的Debian桌面上没有它)请告诉更多,也许提供一些链接。因此,请编辑您的问题以进行改进。
巴西尔·斯塔林凯维奇

1
我认为您不会意识到“停止”信号会停止进程,无论您将其发送到哪个线程。
David Schwartz

1
附加GDB并杀死线程,然后分离。
马丁

1
@ Md.Kawsaruzzaman那就行不通了。例如,假设线程在分配内存的中间,并在内存分配器上持有锁。如果停止线程,则它将永远不会释放锁,最终其他线程也将停止。无论您要做什么,这都不是做到的方式。(可能是您希望停止正在执行的线程的工作。但是您需要流程的协作才能执行此操作。如果它无法提供完成方法,则无法完成。)
David Schwartz

1
还要注意,在屏幕截图中,每个“线程”都有一个单独的PID。我不确定您甚至可以针对单独的线程,因为信号只能发送到进程。
szalski '17

Answers:


16

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

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

通常,除了由应用程序本身进行管理和同步之外,杀死单个线程不是有意义的事情。


5
这根本没有用。OP正在询问如何杀死线程,而不是是否应该杀死线程。
马丁

我想要的是出于某种目的杀死或停止任何特定线程的过程。我认为由于某些错误,有时我们的接收器会自动关闭。由于该程序是由我们自己的研发部门开发的,因此我们正在寻找原因。现在的事情是,有些线程可能会自动关闭。我们已经从代码端测试,并得到了子线程是独立的,但是从服务器端还是得到了一些线程下降,这导致总过程也关机有时..
马里兰州Kawsaruzzaman。

12

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

(我不知道到底什么样的影响将有tgkilltkill-例如使用SIGKILL或者SIGTERM-在一个线程)

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

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

仔细阅读signal(7)signal-safety(7)。信号应发送给进程(通过kill(2))并在线程中进行处理。

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

在编写多线程程序(并希望处理外部信号SIGTERM)时,一个常见的技巧是在您自己的进程中使用pipe(7)并在其他线程中轮询(2)该管道(您可能还会考虑使用Linux特定的signalfd(2)),并带有信号处理程序write(2)-将一个或几个字节放入该管道中。这个众所周知的技巧在Qt文档中得到了很好的解释(即使没有Qt,您也可以在自己的程序中使用它)。


4
tgkill函数无法终止线程。它向线程发送信号。之所以称其为“ kill”是因为它是杀死进程的历史方法,不能用来杀死线程。
David Schwartz

我想向SIGKILL线程发送a 会损害它。还是总是杀死整个过程?那又如何SIGTERM呢?顺便说一句,即使只有一个线程受到损害,我的观点是该进程处于严重状态。
巴西尔·斯塔林凯维奇

5
是的,定义了SIGKILLSIGTERM信号以终止或终止该进程。不管哪个线程接收到它们都是正确的-它们仍然意味着同一件事。在没有紧密配合的情况下终止线程将是胡扯,并且可能对该过程造成灾难性影响。
David Schwartz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.