IO线程day7

该博客展示了如何使用有名管道(FIFO)实现两个进程之间的通信,以及如何捕获特定信号。进程A和B通过FIFO互相发送消息,直到接收到'quit'才终止。同时,代码注释中提供了捕获信号2、3和20的函数,但实际代码并未启用这些信号处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

1)要求AB进程做通信

  1. A进程发送一句话,B进程接收打印

  2. 然后B进程发送给A进程一句话,A进程接收打印

  3. 重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;

代码

进程A代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#define PER(per) {fprintf(stderr,"line: %d ",__LINE__);\
					perror(per);\
					exit(0);}

int main(int argc, const char *argv[])
{
	//清空umask
	umask(0);
	
	//创建有名管道1
	if(mkfifo("fifo1",0755)==-1)
	{
		if(errno!=17)
		{
			PER("mkfifo1")
		}
	}
	printf("mkfifo1 success\n");

	//创建有名管道2
	if(mkfifo("fifo2",0755)==-1)
	{
		if(errno!=17)
		{
			PER("mkfifo2")
		}
	}
	printf("mkfifo2 success\n");

	//以写的方式打开管道1
	
	int fd1=open("fifo1",O_WRONLY);
	if(fd1==-1)
	{
		PER("open")
	}
	printf("open fifo1_WR success\n");

	//以读的方式打开管道2
	
	int fd2=open("fifo2",O_RDONLY);
	if(fd2==-1)
	{
		PER("open")
	}
	printf("open fifo2_RD success\n");




	char w[128]="";
	char r[128]="";
	ssize_t res=0;
	while(1)
	{
		bzero(w,sizeof(w));
		bzero(r,sizeof(r));
		
		//发送
		printf("请输入-->>");
		fgets(w,sizeof(w),stdin);
		w[strlen(w)-1]=0;
		if(strcasecmp(w,"quit")==0)
		{
			printf("退出通讯中\n");
		}
		if(write(fd1,w,sizeof(w))==-1)
		{
			PER("write")
		}

		//接收
		res=read(fd2,r,sizeof(r));
		if(res==-1)
		{
			PER("read")
		}
		else if(res==0)
		{
			if(strcasecmp(w,"quit")==0)
			{
				printf("成功退出通讯\n");
			}
			else
			{
				printf("对方程序退出\n");
			}
			break;
		}

		if(strcasecmp(r,"quit")==0)
		{
			printf("退出通讯\n");
			exit(0);
		}

		printf("read B数据成功,为%ld,%s\n",res,r);

	}

	close(fd1);
	close(fd2);
	return 0;
}

进程B代码

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#define PER(per) {fprintf(stderr,"line: %d ",__LINE__);\
					perror(per);\
					exit(0);}

int main(int argc, const char *argv[])
{
	
	//清空umask
	umask(0);

	//创建有名管道1
	if(mkfifo("fifo1",0755)==-1)
	{
		if(errno!=17)
		{
			PER("mkfifo1")
		}
	}
	printf("mkfifo1 success\n");

	//创建有名管道2
	if(mkfifo("fifo2",0755)==-1)
	{
		if(errno!=17)
		{
			PER("mkfifo2")
		}
	}
	printf("mkfifo2 success\n");
	
	
	//以读的方式打开管道1
	int fd1=open("fifo1",O_RDONLY);
	if(fd1==-1)
	{
		perror("open");
		return -1;
	}
	printf("open fifo1_RD success\n");

	//以写的方式打开管道2
	int fd2=open("fifo2",O_WRONLY);
	if(fd2==-1)
	{
		perror("open");
		return -1;
	}
	printf("open fifo2_WR success\n");

	//读管道
	char r[128]="";
	char w[128]="";
	ssize_t res=0;
	while(1)
	{
		bzero(r,sizeof(r));

		res=read(fd1,r,sizeof(r));
		if(res==-1)
		{
			PER("read")
		}
		else if(res==0)
		{
			if(strcasecmp(w,"quit")==0)
			{
				printf("成功退出通讯\n");
			}
			else
			{
				printf("对方程序退出\n");
			}
			break;
		}
		if(strcasecmp(r,"quit")==0)
		{
			printf("退出通讯\n");
			exit(0);
			
		}
		printf("read A数据成功,为%ld ,%s\n",res,r);
		
		
		bzero(w,sizeof(w));
		printf("请输入-->>");
		fgets(w,sizeof(w),stdin);
		w[strlen(w)-1]=0;
		
		if(strcasecmp(w,"quit")==0)
		{
			printf("退出通讯中\n");
		}


		if(write(fd2,w,sizeof(w))==-1)
		{
			PER("write")
		}
	}

	close(fd1);
	close(fd2);
	return 0;
}

2)捕获2)3)20)号信号

//捕获信号2代码可用,为了调试方便,注释了此代码

代码

#include<stdio.h>
#include<signal.h>
#include<unistd.h>

typedef void (*sighandler_t)(int);

//信号2
void handler2(int sig)
{
	printf("this is 信号%d\n",sig);
}


//信号3
void handler3(int sig)
{
	printf("this is 信号%d\n",sig);
}

//信号20
void handler20(int sig)
{
	printf("this is 信号%d\n",sig);
}


int main(int argc, const char *argv[])
{
	//捕获信号2代码可用,为了调试方便,注释了此代码
	/*                                       
	//捕获信号2
	sighandler_t s2=signal(2,handler2);
	if(s2==SIG_ERR)
	{
		perror("signal");
		return -1;
	}
	*/

	//捕获信号3
	sighandler_t s3=signal(3,handler3);
	if(s3==SIG_ERR)
	{
		perror("signal");
		return -1;
	}
	
	//捕获信号20
	sighandler_t s20=signal(20,handler20);
	if(s20==SIG_ERR)
	{
		perror("signal");
		return -1;
	}

	while(1)
	{
		printf("this is main\n");
		sleep(1);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值