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

如何杀死进程的特定线程?
$ 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

这显示了 PID = 797 的进程myp和具有不同 SPID 的四个线程。

如何杀死进程的特定线程而不杀死整个进程。我知道,在某些情况下,当对该特定线程存在致命依赖时,这可能根本不可能。但是,无论如何都可能吗?是啊,怎么样?

我尝试过kill 799,但进程本身已终止。现在我不确定这是因为存在依赖项在myp没有进程的情况下失败800,或者因为杀死很简单而无法杀死单个进程。

答案1

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

请注意,pthread_kill() 仅导致在给定线程的上下文中处理信号;信号动作(终止或停止)影响整个过程。

答案2

这个问题的典型答案是:通过进程的协作,无论它提供什么机制。没有进程的协作,这是不可能的。进程由线程组成是进程的一个内部细节,即有意设计,不会暴露在进程之外。

答案3

你可能会发现tgkill()有用。正如手册页所提到的,它是 Linux 特定的。

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

答案4

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

pthread_cancel()函数向线程thread发送取消请求。目标线程是否以及何时对取消请求作出反应取决于该线程控制下的两个属性:其可取消性状态和类型。

相关内容