读书人

linux 信号捕捉和处理的有关问题~

发布时间: 2013-01-01 14:04:19 作者: rapoo

linux 信号捕捉和处理的问题~~~在线等

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

/* Simple error handling functions */

#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static void * sig_thread(void * arg)
{
printf("pthread_create\n");
sigset_t *sigset = (sigset_t *) arg;
int ret,sig;
for(;;) {
printf("signal_handle_thread\n");
ret = sigwait(sigset,&sig);
if (ret != 0) {
printf("sigwait fail\n");
}
printf("signal handling thread get signal %d\n",sig);
}
return NULL;
}

int signal_block()
{
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGQUIT);
sigaddset(&sigset, SIGUSR1);
sigaddset(&sigset, SIGCHLD);
int ret = pthread_sigmask(SIG_BLOCK, &sigset, NULL);
if (ret != 0) {
printf("pthread_sigmask error\n");
return -1;
}
pthread_t thread;
ret = pthread_create(&thread,NULL,sig_thread,(void*)&sigset);
if (ret != 0) {
printf("pthread create fail\n");
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
/*
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGQUIT);
sigaddset(&sigset, SIGUSR1);
sigaddset(&sigset, SIGCHLD);
int ret = pthread_sigmask(SIG_BLOCK, &sigset, NULL);
if (ret != 0) {
printf("pthread_sigmask error\n");
return -1;
}
pthread_t thread;
ret = pthread_create(&thread,NULL,sig_thread,(void*)&sigset);
if (ret != 0) {
printf("pthread create fail\n");
return -1;
}*/

signal_block();
pause(); /* Dummy pause so we can test program */


return 0;
}



上面是可以在linux下直接编译执行的。
上面大段的注释部分和独立函数int signal_block()是一模一样的。
现在问题是:
上面代码编译执行后,在终端上使用kill -USR1 pid / kill -QUIT pid / kill -CHLD pid 有时候无法捕捉相应信号,比较随机。

但是将main函数里上面注释部分解除注释,而将signal_block()这个函数注释,也就是说将signal_block里的功能转移到main函数里逐行逐行来实现,在终端上使用kill -USR1 pid / kill -QUIT pid / kill -CHLD pid ,信号捕获就正常。

请各位高人帮忙解答上述现象的原因,在线等,得到结论马上结单。。。
[解决办法]
主程行到pause()
sigset_t sigset;量
已不存在了,我想和有吧

一下linux 信号捕捉和处理的有关问题~
[解决办法]
1, 临时变量
2, 子线程继承父线程信号掩码,所以你的子线程应该先解除信号掩码。

读书人网 >C语言

热点推荐