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

📄 signal.c

📁 这是一个用信号实现父子进程之间简单通讯的程序,要求实现父子进程同步
💻 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 + -