6.线程与信号

62 阅读1分钟

线程和信号,与多进程的信号大有不同

在多线程程序中,外部向进程发送信号不会中断系统调用
在多线程程序中,信号的处理是所有线程共享的,在子线程中忽略信号,则整个进程中的所有线程都忽略了信号
进程中的信号可以送达单个线程,会中断系统调用
如果某个线程因为信号而终止,整个进程将终止

扩展知识:
    比signal()更强大的sigaction()函数
    进程信号屏蔽sigprocmask(), 线程pthread_sigmask();
    其他信号处理函数sigwait(), sigwaitinfo(), sigtimedwait()
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <iostream>
#include <signal.h>

using namespace std;

/*
    在多线程程序中,外部向进程发送信号不会中断系统调用
    在多线程程序中,信号的处理是所有线程共享的,在子线程中忽略信号,则整个进程中的所有线程都忽略了信号
    进程中的信号可以送达单个线程,会中断系统调用
    如果某个线程因为信号而终止,整个进程将终止
*/

void *thmain1(void *arg);    //线程主函数

void func1(int sig)
{
    printf("func1 catch sig=%d\n", sig);
}

int main()
{
    signal(2, func1);
    pthread_t thid1=0, thid2=0;
    if(pthread_create(&thid1, NULL, thmain1, NULL) != 0) {printf("thid1 faile\n"); exit(-1);}

    sleep(1);
    pthread_kill(thid1, 15);        //向子线程发15的信号,整个进程都退出了。
    sleep(10);

    void *ret;
    cout << "join..." << endl;
    pthread_join(thid1, &ret);          //主线程等待子线程退出
    printf("thid1 ret=%ld\n", ret);

    cout << "join ok. " << endl;
}

void *thmain1( void *arg)
{
    /*
    signal(2, SIG_IGN);  //子线程中忽略信号2
    for(int i=0; i<30; i++)
    {
        sleep(1);
        printf("pthmain1 sleep(%d) ok.\n", i+1);
    }
    */
    printf("sleep...\n");
    sleep(50);
    printf("sleep ok.\n");
    return (void*)1;
}