p8-12.c

来自「SUN Solaris8平台下进程间通信」· C语言 代码 · 共 68 行

C
68
字号
#include <signal.h>#include <stdio.h>static volatile sig_atomic_t sigflag;static sigset_t newmask,oldmask,zeromask;static void sig_usr(int);static void output(char*);static void WAIT_PARENT(void);static void TELL_WAIT(void);static void TELL_CHILD(pid_t);int main(void){    pid_t pid;    TELL_WAIT();    if ((pid = fork())<0 )        printf("fork error");    else if (pid == 0) {        WAIT_PARENT();        /* 让父进程先执行 */        output("output from child\n");    } else {        output("out put from parent\n");        TELL_CHILD(pid);    }     exit(0);}static void output(char *str){    char *ptr;    int c;    setbuf(stdout,NULL);              /* 设置无缓冲输出 */    for(ptr = str;c=*ptr++;) {    /*   sleep(1);         */    putc(c,stdout);    }}static void sig_usr(int signo){    sigflag = 1;    return;}void TELL_WAIT(void){    if (signal(SIGUSR1, sig_usr) == SIG_ERR){    printf("signal(SIGUSR1) error");    exit(1);    }    sigemptyset(&zeromask);         sigemptyset(&newmask);    sigaddset(&newmask,SIGUSR1);     /* 阻塞SIGUSR1 并保存当前信号屏蔽 */    if (sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0){        printf("SIG_BLOCK error");        exit(1);    }}void WAIT_PARENT(void){    while (sigflag == 0)    sigsuspend(&zeromask);   /* 等待父进程 */    sigflag = 0;    /* 恢复信号屏蔽至原来的值 */    if (sigprocmask(SIG_SETMASK, &oldmask,NULL)<0)        printf("SIG_SETMASK error");}void TELL_CHILD(pid_t pid){    kill(pid,SIGUSR1);      /* 告诉子进程我们已做完 */}

⌨️ 快捷键说明

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