更新:这个答案可能部分没用。您应该使用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,它与您的进程的进程 id相同(可通过 获取getpid
)。最后一个参数是内核线程 ID,您可以使用 获取它gettid
,它也构成了/proc/<pid>/task/
Linux 中的目录。
最后,您需要能够等待信号到达。为此,您可以使用 or 阻塞线程中的信号,pthread_sigmask
然后使用sigwaitinfo
orsigtimedwait
:
// 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);