首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-01-01 
linux 信号捕捉和处理的问题~~~在线等#include pthread.h#include stdio.h#include stdlib.h#includ

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, 子线程继承父线程信号掩码,所以你的子线程应该先解除信号掩码。

热点排行