⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p8-15.c

📁 SUN Solaris8平台下进程间通信
💻 C
字号:
#include <signal.h>#include <setjmp.h>#include <stdio.h>#include "err_exit.h"static void  sig_usr1(int),sig_alrm();static sigjmp_buf jmpbuf;static volatile sig_atomic_t canjmp;static int sigalrm_appear;void pr_mask(const char *);int main(void){  if(signal(SIGUSR1,sig_usr1) == SIG_ERR)     err_exit("signal(SIGUSR1) error");  if(signal(SIGALRM,sig_alrm) == SIG_ERR)     err_exit("signal(SIGALRM) error");  printf("starting main: \n");  if(sigsetjmp(jmpbuf,1)){     pr_mask("ending main: ");     exit(EXIT_SUCCESS);  }  canjmp = 1;     /* sigsetjmp() 已被调用过 */  for(;;)                  pause();      /* 等待信号 */}static void sig_usr1(int signo){   time_t startime;   if(canjmp == 0)      return;      /* 不期望的信号,忽略*/   pr_mask("starting sig_usr1: ");   alarm(3);       /* 3秒之后生成SIGALRM信号 */   while(!sigalrm_appear);           /* 等待SIGALRM */   pr_mask("finishing sig_usr1:");   canjmp = 0;   siglongjmp(jmpbuf,1);            /* 跳回到main,不返回 */}static void sig_alrm(int signo){   pr_mask("in sig_alrm: ");   sigalrm_appear = 1;   return;}void pr_mask(const char *str){   sigset_t sigset;   int   i,   errno_save;   errno_save = errno;   if (sigprocmask(0,NULL,&sigset) < 0)       err_exit("sigprocmask error");   printf(" %s\n",str);   fflush(stdout);   for(i = 1; i < NSIG; i++)      if(sigismember(&sigset,i))          psignal(i,"  ");   printf("\n");   errno = errno_save;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -