哪个线程处理信号?

哪个线程处理信号?,第1张

哪个线程处理信号

如果将信号发送给进程,则该进程中的哪个线程将处理该信号尚未确定。

根据

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(); }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4972929.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存