如何杀死进程的特定线程?


21
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

这显示了mypPID = 797 的过程以及四个具有不同SPID的线程。

我如何才能杀死进程的特定线程而又不杀死整个进程。我知道,在某些情况下,如果特定线程上存在致命依赖关系,则可能根本不可能。但是,在任何情况下都有可能吗?是的,如何?

我尝试过kill 799,该过程本身已终止。现在,我不确定这是由于myp没有该进程800而导致依赖项失败,还是因为kill很简单,无法杀死单个进程。

Answers:


26

线程是进程不可或缺的一部分,不能在进程外被杀死。有pthread_kill函数,但是它仅适用于线程本身的上下文。从链接的文档中:

注意,pthread_kill()仅使信号在给定线程的上下文中进行处理。信号作用(终止或停止)会影响整个过程。


+1。只是在这里添加。在该过程中,您可以使用pthread_kill()将信号发送到各个线程。可能是您可以添加一些执行此操作的信号处理程序。
Hemant 2010年

@hemant:假设MS Word使用单独的线程进行拼写检查。除非以这种方式设计,否则杀死该线程不应使整个过程崩溃。在这种情况下,为什么没有该线程就无法存在该进程?
拉泽尔

1
好吧,我想您可以设计一个独立于父进程的线程模型,但允许外部进程杀死进程内线程,但这在我不愿透露的关于安全性,进程管理和系统完整性方面产生了蠕虫病毒。认为任何系统设计人员都不会愿意屈服于此。没有这些麻烦,线程足够硬。从内部杀死线程不是问题,因为工作是由父进程完成的,如果出现任何问题并且可以自动或以其他方式杀死,则由父进程负责。
gvkv

“除非是采用这种方式设计的”:使用线程的主要原因正是为了使您可以共享资源。这就像敲了一半房子。
pjc50 2011年

2
@Lazer,因为您正在键入,一个线程无法在另一个线程更新文本的同时检查拼写。因此,要有一个后台拼写检查线程,它必须做一些事情,例如抓一把锁,以防止其他线程更改文本,复制某些单词,释放该锁,然后检查其中的复制单词。背景。如果您恰巧在它锁定时杀死了它,则在尝试键入时将立即挂起另一个线程。多线程应用程序充满了像这样的相互依赖性。
psusi 2012年

6

对该问题的典型回答是:在过程的合作下,通过其提供的任何机制。没有流程的合作,这是不可能的。流程由线程组成是流程的内部细节,通过有意的设计不会暴露在流程之外。


那么从命令行发送其他信号呢?
yucer

@yucer我不确定我是否理解您的要求。
大卫·史瓦兹

我的意思是从“ kill -l”所示的列表中发送另一个信号。我正在寻找一种命令特定线程转储堆栈跟踪以查看其功能的方法。
yucer

@yucer这将是特定于平台的。有些确实提供了一种命令特定线程转储堆栈的方法。就个人而言,我发现仅使用脚本将调试器(如gdb)附加到进程,命令所有线程转储堆栈,然后分离就更容易了。
David Schwartz '18

1

除了@gkv的答案,您还可以查看函数pthread_cancel(3),它是的一部分<pthread.h>。从手册页:

pthread_cancel()函数将取消请求发送到线程线程。目标线程是否以及何时响应取消请求取决于该线程控制的两个属性:其取消状态和类型。


1

您可能会发现tgkill()有用。如手册页所述,它特定于Linux。

tgkill()将信号sig发送到线程组tgid中具有线程ID tid的线程。(相比之下,kill(2)只能用于将信号作为一个整体发送到一个进程(即线程组),并且该信号将被传递到该进程内的任意线程。)


这没有解决关于如何杀死线程的问题,而不是关于如何向线程发送信号的问题。
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.