我有一个测试用例,其中有一些线程在clone()中使用CLONE_THREAD选项生成。如果我想杀死一个特定的线程,我想我们应该在systemcall()中使用SYS_tgkill。但是如果它在内核空间中等待(例如futex_wait),kill会不会影响一个线程?
我尝试杀死以上述方式创建的线程。但是当SIGKILL被发送到同一时间时,整个过程都被杀死了。我在使用系统调用时失去了一些东西(SYS_tgkill,pid,tid,9)?
答案 0 :(得分:1)
SIGKILL
始终会杀死目标进程。没有办法解决这个问题;它是不可阻挡的,不可忽视的,无法捕捉的。
您可以尝试发送另一个信号(例如SIGUSR1
或SIGHUP
或SIGRTMIN
)并安装一个调用pthread_exit
的信号处理程序(但请注意,此功能不是async-signal-safe,所以你必须确保信号处理程序不会中断另一个async-signal-unsafe函数)或使用cancel(pthread_cancel
)来阻止被阻塞的线程。
这应该适用于正常的阻塞操作(比如等待来自管道或套接字的数据),但是如果线程处于不间断的睡眠状态(比如尝试从严重划伤的CD读取或难以理解),它将无法帮助您磁盘)。