线程和信号,与多进程的信号大有不同
在多线程程序中,外部向进程发送信号不会中断系统调用
在多线程程序中,信号的处理是所有线程共享的,在子线程中忽略信号,则整个进程中的所有线程都忽略了信号
进程中的信号可以送达单个线程,会中断系统调用
如果某个线程因为信号而终止,整个进程将终止
扩展知识:
比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;
}