一个学习等待信号sigsuspend()很好的例子

来源:互联网 发布:linux home空间用完了 编辑:程序博客网 时间:2024/06/06 21:43

#include <stdio.h>
#include <stdlib.h>
#include <bits/sigset.h>
#include <signal.h>
#include <errno.h>
void pr_mask(char *str)
{
 sigset_t sigset01;
 int errno_save;
 errno_save=errno;
 
 if(sigprocmask(0,NULL,&sigset01)==-1)
  perror("provmask");
 printf("%s\n",str);
 if(sigismember(&sigset01,SIGINT))
  printf("SIGINT\n");
 if(sigismember(&sigset01,SIGUSR1))
  printf("SIGUSR1\n");
 if(sigismember(&sigset01,SIGQUIT))
  printf("SIGQUIT\n");
 if(sigismember(&sigset01,SIGALRM))
  printf("SIGALRM\n");
 errno=errno_save;
}
void sig_int(int sig)
{
 printf("signo is %d\n",sig);
 pr_mask("\ntest:in sig_int\n");
}

int main()
{
 sigset_t oldmask,newmask,waitmask;
 printf("mypid is :%d\n",getpid());
 pr_mask("program start");
 if(signal(SIGINT,sig_int)==SIG_ERR)
 {
  perror("signal");
  exit(1);
 }
 if(signal(SIGUSR1,sig_int)==SIG_ERR)
 {
  perror("signal2");
  exit(1);
 }
 sigemptyset(&waitmask);
 sigemptyset(&newmask);
 sigaddset(&waitmask,SIGUSR1);
 sigaddset(&newmask,SIGINT);
 sigaddset(&newmask,SIGUSR1);
 
 if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)==-1)//SIGINT
  perror("promask");
 pr_mask("in the critical region");
 
 if(sigsuspend(&waitmask)!=-1)//SIGUSR1
  perror("sigsuspend");
 
 pr_mask("after return from sigsuspend");
 if(sigprocmask(SIG_SETMASK,&oldmask,NULL)==-1)
  perror("sigprocmask");
 pr_mask("\nprogram exit()\n");

 return 0;
}

先发源码,有时间写下注解。