📄 signal.c
字号:
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include "ourhdr.h"
static volatile sig_atomic_t sigflag1=0;static volatile sig_atomic_t sigflag2=0;static sigset_t newmask,oldmask,zeromask;static void sig_usr(int signo);void TELL_WAIT(void);void TELL_PARENT(pid_t pid);void WAIT_PARENT(void);void TELL_CHILD(pid_t pid);void WAIT_CHILD(void);
intmain(void){ FILE *fp; char c; char buf[MAXLINE]; pid_t pid; TELL_WAIT(); if((pid=fork())<0) return -1; else if(pid==0)
{ while(sigflag1==0) { WAIT_PARENT(); printf("子进程,输入将写入文件:\n"); fgets(buf,MAXLINE,stdin); if((fp=fopen("log.dat","a"))==NULL)
{ err_sys("file open error\n"); exit(-1); } fprintf(fp,"%s",buf); fclose(fp); TELL_PARENT(getppid()); } }
TELL_CHILD(pid); while(sigflag2==0)
{ WAIT_CHILD(); printf("父进程,已经输入的是:\n"); if((fp=fopen("log.dat","r"))==NULL)
{ err_sys("file open error\n"); exit(-1); } while((c=fgetc(fp))!=EOF) if(fputc(c,stdout)==EOF) err_sys("output error\n"); printf("\n"); fclose(fp); TELL_CHILD(pid); }}
static voidsig_usr(int signo){ if(signo==SIGUSR1)sigflag1=1; else sigflag2=1; return;}
voidTELL_WAIT(void){ if(signal(SIGUSR1,sig_usr)==SIG_ERR) err_sys("signal (SIGUSR1) error\n"); if(signal(SIGUSR2,sig_usr)==SIG_ERR) err_sys("signal (SIGUSR2) error\n"); sigemptyset(&zeromask); sigemptyset(&newmask); sigaddset(&newmask,SIGUSR1); sigaddset(&newmask,SIGUSR2); if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0) err_sys("SIG_BLOCK error\n");}
void TELL_PARENT(pid_t pid)
{ kill(pid,SIGUSR2);}
voidWAIT_PARENT(void){ while(sigflag1==0) sigsuspend(&zeromask);
sigflag1=0; if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0) err_sys("SIG_SETMASK error\n");}
voidTELL_CHILD(pid_t pid){ kill(pid,SIGUSR1);}
voidWAIT_CHILD(void){ while(sigflag2==0) sigsuspend(&zeromask);
sigflag2=0; if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0) err_sys("SIG_SETMASK error\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -