📄 p8-12.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 + -