现在的位置: 首页 > 综合 > 正文

关于线程间的信号处理

2014年02月19日 ⁄ 综合 ⁄ 共 3016字 ⁄ 字号 评论关闭

最近在学习线程的东西,在线程的信号处理中遇到了问题。下面是找到的资料和分析。

网址:http://www.ibm.com/developerworks/cn/linux/l-cn-signalsec/

下有关于linux下信号的调度策略的问题,说的听明白的。在此不再赘述。

 

#include<stdio.h>

#include<pthread.h>

#include<stdlib.h>

#include<unistd.h>

#include<signal.h>

void *sigone_program(void *arg);

void *sigtwo_program(void *arg);

void report(int);

pthread_t thread_one,thread_two;

int main(int argc,char *argv[])

{

       int i;

       void *status;

         if(pthread_create(&thread_one,NULL,sigone_program,NULL)!=0)

       {

               fprintf(stderr,"pthread_create failure\n");

                exit(EXIT_FAILURE);

       }

       if(pthread_create(&thread_two,NULL,sigtwo_program,NULL)!=0)

       {

               fprintf(stderr,"pthread_createfailure\n");

                exit(EXIT_FAILURE);

       }

       sleep(1);

       printf("this is parent ,send SIGUSR1,SIGUSR2 to thread%u\n",thread_one);

       if(pthread_kill(thread_one,SIGUSR1)!=0)

       {

               perror("pthread_kill");

                exit(EXIT_FAILURE);

       }

       if(pthread_kill(thread_one,SIGUSR2)!=0)

       {

               perror("pthread_kill");

                exit(EXIT_FAILURE);

       }

       printf("this is parent ,send SIGUSR1,SIGUSR2  to thread %u\n",thread_two);

       if(pthread_kill(thread_two,SIGUSR1)!=0)

       {

               perror("pthread_kill");

                exit(EXIT_FAILURE);

       }

       if(pthread_kill(thread_two,SIGUSR2)!=0)

       {

               perror("pthread_kill");

                exit(EXIT_FAILURE);

       }

         sleep(1);

         if(pthread_kill(thread_one,SIGKILL)!=0)

       {

               perror("pthread_kill");

                exit(EXIT_FAILURE);

       }

       pthread_join(thread_two,NULL);

       pthread_join(thread_one,NULL);

       return 0;

}

void *sigone_program(void *arg)

{

       int i;

       __sigset_t set;

 

         signal(SIGUSR1,report);

    sigfillset(&set);

    sigdelset(&set,SIGUSR2);

         pthread_sigmask(SIG_BLOCK,&set,NULL);

         /*

         intsigemptyset(sigset_t *set); //清空信号集

  int sigfillset(sigset_t *set); //将所有信号填充进set中

      int sigaddset(sigset_t*set, int signum); //往set中添加信号signum

      int sigdelset(sigset_t*set, int signum); //从set中移除信号signum

      int sigismember(const sigset_t*set, int signum); //判断signnum是不是包含在set中,在返回1,不在返回0

         */

         if(sigismember(&set,SIGUSR1))

         printf("SIGUSR1IN \n");

       if(sigismember(&set, SIGUSR2))

         printf("SIGUSR2IN \n");

       for(i=0;i<5;i++)

       {

                printf("this is set mask%u thread\n",pthread_self());

                pause();

             }

}

void report(int sig)

{

       printf("\nin signal ,the sig=%d\t,the threadid=%u\n",sig,pthread_self());

}

 

void *sigtwo_program(void *arg)

{

       int i;

       signal(SIGUSR2,report);

       for(i=0;i<5;i++)

       {

                printf("this is no setmask %u thread\n",pthread_self());

                pause();

             }

}

执行结果如下:

分析:先将所有的信号填入set中,然后再去掉SIGUSR2,然后输出判断SIGUSR1 SIGUSR2是否在set中,结果如上,只有SIGUSR1在,在后来信号的处理过程中函数:void *sigone_program(void *arg)只能够处理信号:12(SIGUSR2),那么可以确定函数:pthread_sigmask(SIG_BLOCK,&set,NULL);的作用可以确定为;该函数处理即阻塞在set中的所有信号,包括SIGUSR1。

以上是个人的观点,如有不妥之处,欢迎指点,相互学习。

邮箱地址:guo__qiu@126.com

 

抱歉!评论已关闭.