更新:這個答案可能是部分無用的。您應該使用pthread_kill
將信號發送到特定的線程。但是,如果有人發現某些東西,我會留下來。
在Linux中,線程不能與kill
處理,因爲kill
將信號發送到任何隨機線程不阻止信號。
取而代之,您需要系統調用tgkill
,它針對特定的線程。哪個線程?您可以通過系統調用gettid
找到答案。
不幸的是,glibc沒有爲這兩個系統調用提供包裝。沒問題,你可以寫自己的那些:
#include <signal.h>
#include <sys/syscall.h>
#include <sys/types.h>
pid_t gettid()
{
return syscall(SYS_gettid);
}
int tgkill(int sig, pid_t pgid, pid_t tid)
{
return syscall(SYS_tkill, sig, pgid, tid);
}
的tgkill
的第一個參數是信號,如爲kill
。第二個是線程組號,它與您的進程的進程ID相同(可通過getpid
獲得)。最後一個參數是內核線程ID,您可以通過gettid
獲得內核線程ID,它也構成Linux上/proc/<pid>/task/
中的目錄。
最後,您需要能夠等待信號到達。您可以通過與pthread_sigmask
,然後使用sigwaitinfo
or sigtimedwait
阻塞線程的信號做到這一點:
// block signal
sigset_t newset, oldset;
sigemptyset(&nweset);
sigaddset(&newset, SIGUSR1);
pthread_sigmask(SIG_BLOCK, &newset, &oldset);
// wait
sigwaitinfo(&newset, NULL);
// restore previous signal mask
pthread_sigmast(SIG_SETMASK, &oldset, NULL);
的手冊頁是否有一個原因,你必須使用信號(看起來像同步問題)? – jev
你是什麼意思的「隨機過程」?您可以爲每個線程設置信號掩碼,只允許信號到達某些線程,然後使用'kill'讓內核選擇一個任意的隨機線程來接收信號。或者您可以主動枚舉所有線程,使用隨機數生成器從中選擇,併發送定向信號。 –
@KerrekSB,我可以同時向兩個進程發送一個信號,並且哪個有空可以處理這個信號?或者我可以創建屬於同一組的少量進程並將信號發送給整個組? – Mike