sigaction函数一

试验 struct sigaction 的 mask ,让他做到 在处理SIGUSR信号的时候,堵塞 SIGINT 和
       SIGUSR2 信号(这两两个信号都是从fork出的子进程中发出来的)

#include "public.h"

void myaction(int sig,siginfo_t *info,void *reverse)
{
 int i=0;
 while (i<5)
 {
  /*printf("i = %d  sig=%d\n",i,sig);
  printf("recive value=%d\n",info->si_value.sival_int);
  printf("info->si_int=%d\n",info->si_int);
  printf("info->si_pid=%d\n",info->si_pid);
  */
  printf("myaction %d\n",i);
  sleep(1);
  i++;
 }
}
void myaction1(int sig,siginfo_t *info,void *reverse)
{
 for (int i=0;i<5;i++)
 {
  printf("myaction1 = %d\n",i);
  sleep(1);
 }
}

void myaction2(int sig,siginfo_t *info,void *reverse)
{
 for (int i=0;i<5;i++)
 {
  printf("myaction2 = %d\n",i);
  sleep(1);
 }
}


int main()
{
 int num=0;
 pid_t pid;
 
 //在这里写信号
 union sigval sival_data;
 struct sigaction action;
 action.sa_sigaction=myaction;
 action.sa_flags=SA_SIGINFO|SA_RESTART;
 sigemptyset(&action.sa_mask);
 sigaddset(&action.sa_mask,SIGUSR2);
 sigaddset(&action.sa_mask,SIGINT);
 sigaction(SIGUSR1,&action,NULL);
 
 action.sa_sigaction=myaction1;
 action.sa_flags=SA_SIGINFO|SA_RESTART;
 sigaction(SIGUSR2,&action,NULL);

 action.sa_sigaction=myaction2;
 action.sa_flags=SA_SIGINFO|SA_RESTART;
 sigaction(SIGINT,&action,NULL);
 sigqueue(getpid(),SIGUSR1,sival_data);
 pid=fork();
 if (pid==-1)
 {
  perror("fork fail\n");
  exit(1);
 }
 if (pid>0)
 {
  //父进程负责创建子进程,新建的进程会从上一个逻辑层开始
  if (num<2)
  {
   pid=fork();
   num++;
  }
 }
 else if (pid ==0)
 {
  
  if (num==0)
  {
   sival_data.sival_int=num;
   sigqueue(getpid(),SIGUSR2,sival_data);
  }
  if (num==1)
  {
   sival_data.sival_int=num;
   sigqueue(getpid(),SIGINT,sival_data);
  }
 }

 return 0;
}

 

转载于:https://www.cnblogs.com/newlist/archive/2011/11/24/2261628.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值