最近在学习线程的东西,在线程的信号处理中遇到了问题。下面是找到的资料和分析。
网址: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