|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void printsigset(sigset_t *set)
{
int i=1;
for(i=1;i<32;++i)
{
if(sigismember(set,i))
putchar('1' );
else
putchar('0');
}
puts(" ");
fflush(stdout);
}
void myhandler(int signum,siginfo_t *info,void *p)
{
struct sigaction bct;
sigemptyset(&bct.sa_mask);
sigset_t pset;
if(signum==SIGUSR1)
{
// sigemptyset(&bct.sa_mask);
sigaddset(&bct.sa_mask,SIGINT);
// sigprocmask(SIG_BLOCK,&bct.sa_mask,NULL);
sigprocmask(SIG_SETMASK,&bct.sa_mask,NULL);
printsigset(&bct.sa_mask);
// sigpending(&pset);
// printsigset(&pset);
sleep(5);
puts("我被阻塞了");
}
if(signum==SIGUSR2)
{
// sigaddset(&act.sa_mask,SIGINT);
sigprocmask(SIG_UNBLOCK,&bct.sa_mask,NULL);
printsigset(&bct.sa_mask);
//sleep(5);
puts("我被解除阻塞了");
}
if(signum==SIGINT)
{
// sigpending(&pset);
// printsigset(&pset);
printf("recv ...\n");
// exit(1);
}
}
int main(void)
{
struct sigaction act;
act.sa_flags=SA_SIGINFO;
//清空信号集
// sigemptyset(&act.sa_mask);
act.sa_sigaction = myhandler;
//将sigint加入屏蔽信号集
//sigaddset(&act.sa_mask,SIGINT);
//sigprocmask(SIG_BLOCK,&act.sa_mask,NULL);
if(sigaction(SIGINT,&act,NULL)==-1)
{
perror("signal err");
exit(0);
}
else
{
puts("secess...");
}
if(sigaction(SIGUSR1,&act,NULL)==-1)
{
perror("signal err");
exit(0);
}
if(sigaction(SIGUSR2,&act,NULL)==-1)
{
perror("signal err");
exit(0);
}
/*
pid_t pid = fork();
if(pid==0)
{
pid = getppid();
int n = 10;
union sigval val;
val.sival_ptr = "hello";
if( sigqueue(pid,SIGUSR2,val)==-1)
{
perror("sigqueue err");
exit(8);
}
puts("信号已经发送过去");
while(n)
{
n = sleep(n);
printf("睡觉中...");
}
exit(0);
}
if(pid < 0)
{
perror("fork err");
exit(1);
}
else
*/
// sigset_t pset;
while(1)
{
//j sigpending(&pset);
// printsigset(&pset);
sleep(1);
}
printf("父进程退出了吗");
return 0;
}
|
|