多线程对信号的接受处理

最近刚从linux C转做android,老大突然看着我闲,叫我去验证一下“一个进程有多个子线程,子线程都注册监听某个信号,另一个进程向它发送该信号的时候,它会怎么处理?”。

带着这个问题,我搜索了各个贴子之后,大概得出:

进程处理信号,你需要注册signal的一个处理函数,线程你需要用signal_wait去等待一个信号。大体得出,如果一个多线程的进程得到了信号,它是会在它诸多子线程里面选一个来执行,有人说是正在进行的那个线程。在多线程环境下,一般会让其他子线程不处理信号,专门用一个线程来处理信号,把异步变成同步处理。

光看人家的贴子是不行的的。为此,我写了如下代码来验证:

#include <stdio.h>
#include <signal.h>

#include <stddef.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>

static pthread_t g_thread_ids[2]={0};

void ouch1(int sig)
{
    printf("mainthread interrupted,thread id:%u\n",(unsigned int)pthread_self());
    //signal(SIGINT,SIG_DFL);
}
void ouch2(int sig)
{
    printf("child thread 1 interrupted,thread id:%u\n",(unsigned int)pthread_self());
    //signal(SIGINT,SIG_DFL);
}
void ouch3(int sig)
{
    printf("child thread 2 interrupted,thread id:%u\n",(unsigned int)pthread_self());
   //signal(SIGINT,SIG_DFL);
}

void thread_loop1(char* msg)
{ 

    printf("child thread 1 signal now \n");
    signal(SIGINT,ouch2);
    printf("chilid thread1:%d,%s",(int)getpid(),msg);
    while(1);

}
void thread_loop2(char* msg)
{

    printf("child thread 2 signal now\n");
    signal(SIGINT,ouch3);
    printf("child thread2:%d,%s",(int)getpid(),msg);
    while(1);

}
void thread_wait2()
{
    //waiting for thread terminate
    if(g_thread_ids[0]!=0)
    {
        pthread_join(g_thread_ids[0],NULL);
        printf("thread %d terminated\n",getpid());
    }
    if(g_thread_ids[1]!=0)
    {
        pthread_join(g_thread_ids[1],NULL);
        printf("thread %d terminated\n",getpid());
    }
}

//=============test multi-thread test.

void start_test()
{
    pthread_t thread1,thread2;
    char *msg1="this is thread 1\n";
    char *msg2="this is thread 2\n";
    printf("main thread signal now\n");
    signal(SIGINT,ouch1);
    printf("main thread signal now\n");
    pthread_create(&thread1,NULL,(void*)thread_loop1,(void*)msg1);
    g_thread_ids[0]=thread1;
    pthread_create(&thread2,NULL,(void*)thread_loop2,(void*)msg2);
    g_thread_ids[1]=thread2;

    thread_wait2();
    printf("all thread finished its tasks\n");

    return ;

}

int main()
{
    start_test();
    return 0;
}

上述代码的输出是,谁最后调用signal,谁就会一直处理该信号。

说明,跟正在执行的线程没关系,指定一个之后就会一直由它来处理。如果对一个信号注册了多次,那么最后一次有效,其他的都无效。

mark一下。

时间: 2024-08-01 12:38:26

多线程对信号的接受处理的相关文章

多线程与信号

1. 每个线程都有自己的信号屏蔽字 2. 每个线程都对同一信号都共享一个信号处理函数. 3. 主线程设置了pthread_sigmask后,子线程将复制一份设置好的信号屏蔽字. 然后我们来看下线程和进程间的比较 子进程继承父进程的属性: 子线程继承主线程的属性: 实际用户ID,实际组ID,有效用户ID,有效组ID: 附加组ID: 进程组ID: 会话ID: 控制终端: 设置用户ID标志和设置组ID标志: 当前工作目录: 根目录: 文件模式创建屏蔽字(umask): 信号屏蔽和安排: 针对任一打开文

perl 多线程及信号控制

#!/usr/bin/perl use strict; use warnings; use threads; use Thread::Semaphore; my $max_thread = 5; my $semaphore = Thread::Semaphore->new($max_thread); sub TestFun { $semaphore->up(); } for(my $index = 1; $index <= 10; $index ++) { $semaphore->

UNIX信号

UNIX编程第10章 信号是软件中断.很多比较重要的应用程序都需处理信号.信号提供了一种处理异步事件的方法,例如,终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序. 每个信号都有一个名字,这些名字都以SIG开头,例如SIGABRT是夭折信号,当进程调用abort函数时产生这种信号.SIGALARM是闹钟信号,由alarm函数设置的定时器超时后将产生此信号.在头文件<signal.h>中,信号名都被定义为正整数常量(信号编号). 不存在编号为0的信号,空信号. 很多条

shell中trap捕捉到信号的处理

一. trap捕捉到信号之后,可以有三种反应方式: (1)执行一段程序来处理这一信号 (2)接受信号的默认操作 (3)忽视这一信号 二. trap对上面三种方式提供了三种基本形式: 第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双 引号中的命令串. trap 'commands' signal-list trap "commands" signal-list 为了恢复信号的默认操作,使用第二种形式的trap命令: trap signal-

iOS开发--多线程 并行开发

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

iOS 多线程详解

iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作: 对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续执行,用户同样可以继续进行其他UI操作,与此同时前一个操作的后续任务可以分散到多个空闲CPU中继续执行(当然具体调度顺序要根据

iOS多线程 NSThread/GCD/NSOperationQueue

http://www.cnblogs.com/kenshincui/p/3983982.html iOS开发系列--并行开发其实很容易 2014-09-20 23:34 by KenshinCui, 9738 阅读, 19 评论, 收藏,  编辑 --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种

trap在shell中捕捉信号

一.trap捕捉到信号之后,可以有三种反应方式:(1)执行一段程序来处理这一信号(2)接受信号的默认操作(3)忽视这一信号 二.trap对上面三种方式提供了三种基本形式:第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双引号中的命令串.trap ‘commands’ signal-listtrap “commands” signal-list为了恢复信号的默认操作,使用第二种形式的trap命令:trap signal-list第三种形式的trap命令

Linux C 信号 pause、sigsuspend 的相同与区别

pause函数:       功能:让进程暂停直到信号出现   #include<unistd.h>      intpause();    函数说明:pause()会令目前的进程暂停(进入睡眠状态),直至信号(signal)所中断. 返回值:只返回-1. #include<stdio.h> #include<unistd.h> void deal() { printf(“信号干扰!\n”); } void main() { printf(“进程执行!\n”); sig