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

📄 p8-12.c

📁 SUN Solaris8平台下进程间通信
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -