oid work();
void handler(int);
int main()
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGQUIT, &sa, 0);
pthread_t tid;
pthread_create(&tid, 0, work_thread, 0);
work();
return 0;
}
void handler(int s)
{
char buf[32];
snprintf(buf, sizeof(buf), "\n%ld recv signal", syscall(SYS_gettid));
psignal(s, buf);
}
void *work_thread(void *p)
{
/*struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sa.sa_flags = SA_RESTART;
sigemptyset(&sa.sa_mask);
sigaction(SIGINT, &sa, 0);*/
for(;;) {
fprintf(stderr, "I\'m Zuro %ld\n", syscall(SYS_gettid));
sleep(2);
raise(SIGQUIT);
}
return (void *)0;
}
void work()
{
for(;;) {
pause();
fprintf(stderr, "I\'m Zuro %ld\n", syscall(SYS_gettid));
}
}
===================================================
这次我在主线程注册SIGQUIT信号处理函数,而在另一个线程
调用raise(SIGQUIT)函数产生这个信号。注意实验1和实验3的
区别:实验1的SIGQUIT信号是由终端shell发送,而实验3的信号
是由进程本身的一个线程产生。实验表明:信号不是发送
给主线程,而是发送给产生SIGQUIT信号的线程。
综上所诉,如果信号是由本进程产生,那么信号发给产生这个信号
的线程;如果信号是由其他进程产生,则信号发送给主线程。
摘自 leeshuheng的专栏