程序博客网 > 2.5次元自动测量编程
来源:互联网 发布:2.5次元自动测量编程 编辑:程序博客网 时间:2024/06/08 14:02
#include "apue.h"static volatile sig_atomic_t sigflag; /* set nonzero by sig handler */static sigset_t newmask, oldmask, zeromask;static voidsig_usr(int signo)/* one signal handler for SIGUSR1 and SIGUSR2 */{sigflag = 1;}voidTELL_WAIT(void){if (signal(SIGUSR1, sig_usr) == SIG_ERR)err_sys("signal(SIGUSR1) error");if (signal(SIGUSR2, sig_usr) == SIG_ERR)err_sys("signal(SIGUSR2) error");sigemptyset(&zeromask);sigemptyset(&newmask);sigaddset(&newmask, SIGUSR1);sigaddset(&newmask, SIGUSR2);/* * Block SIGUSR1 and SIGUSR2, and save current signal mask. */if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)err_sys("SIG_BLOCK error");}voidTELL_PARENT(pid_t pid){kill(pid, SIGUSR2);/* tell parent we're done */}voidWAIT_PARENT(void){while (sigflag == 0)sigsuspend(&zeromask);/* and wait for parent */sigflag = 0;/* * Reset signal mask to original value. */if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)err_sys("SIG_SETMASK error");}voidTELL_CHILD(pid_t pid){kill(pid, SIGUSR1);/* tell child we're done */}voidWAIT_CHILD(void){while (sigflag == 0)sigsuspend(&zeromask);/* and wait for child */sigflag = 0;/* * Reset signal mask to original value. */if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)err_sys("SIG_SETMASK error");}