如果将信号发送给进程,则该进程中的哪个线程将处理该信号尚未确定。
根据
pthread(7):
POSIX.1还要求线程共享一系列其他属性(即,这些属性是进程范围而不是每个线程的属性):
…-
信号处置
…POSIX.1区分了针对整个过程的信号和针对各个线程的信号的概念。根据POSIX.1,过程控制信号(
kill(2)例如,使用发送)应由过程中的单个
任意 选择的线程处理。
如果您希望进程中的专用线程处理某些信号,请参见以下示例,其中
pthread_sigmask(3)显示了 *** 作方法:
下面的程序在主线程中阻塞了一些信号,然后创建了一个专用线程来通过sigwait(3)获取这些信号。以下shell会话演示了其用法:
$ ./a.out &[1] 5423$ kill -QUIT %1Signal handling thread got signal 3$ kill -USR1 %1Signal handling thread got signal 10$ kill -TERM %1[1]+ Terminated ./a.out
节目来源
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <errno.h>#define handle_error_en(en, msg) do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)static void *sig_thread(void *arg){ sigset_t *set = arg; int s, sig; for (;;) { s = sigwait(set, &sig); if (s != 0) handle_error_en(s, "sigwait"); printf("Signal handling thread got signal %dn", sig); }}intmain(int argc, char *argv[]){ pthread_t thread; sigset_t set; int s; sigemptyset(&set); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGUSR1); s = pthread_sigmask(SIG_BLOCK, &set, NULL); if (s != 0) handle_error_en(s, "pthread_sigmask"); s = pthread_create(&thread, NULL, &sig_thread, (void *) &set); if (s != 0) handle_error_en(s, "pthread_create"); pause(); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)