我有一个测试用例,其中在 clone() 中使用 CLONE_THREAD 选项产生了线程。如果我想杀死一个特定的线程,我想我们应该在 systemcall() 中使用 SYS_tgkill。但是如果线程在内核空间中等待(比如 futex_wait),kill 是否会真正影响线程?
我尝试杀死以上述方式创建的线程。但是当 SIGKILL 被发送到同一线程时,整个进程都被杀死了。我在使用 syscall(SYS_tgkill,pid,tid,9) 时遗漏了什么?
SIGKILL
总是杀死目标进程。没有办法解决这个问题。它是不可阻挡、不可忽视和不可捕获的。
您可以尝试发送另一个信号(如SIGUSR1
or SIGHUP
or SIGRTMIN
)并安装一个调用的信号处理程序pthread_exit
(但请注意,此函数不是异步信号安全的,因此您必须确保信号处理程序不会中断另一个异步信号不安全函数)或使用取消(pthread_cancel
)来停止被阻塞的线程。
这应该适用于正常的阻塞操作(例如等待来自管道或套接字的数据),但如果线程处于不可中断的睡眠状态(例如尝试从严重划伤的 CD 或故障硬盘中读取),它将无济于事。