栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

哪个线程处理信号?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

哪个线程处理信号?

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

根据

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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390801.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号