Day26

该文章展示了一个C语言程序,通过创建FIFO(命名管道)来实现两个进程(A.c和B.c)之间的通信。每个进程分别打开两个管道,一个用于写入,另一个用于读取。子进程读取用户输入并写入管道,而父进程则从管道读取数据并打印。当接收到quit时,通信结束。
摘要由CSDN通过智能技术生成

思维导图

在这里插入图片描述

练习

使用管道实现AB两个进程之间的互相通信
------------------------------------A.c------------------------------------

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//定义文件描述符
	int fdA,fdB;
	//定义一个子线程
	pid_t pid = fork();

	//定义容器
	char bufA[128] = "", bufB[128] = "";

	//打开文件A,myfifoA为B向A传输的信息
	if((fdA = open("./myfifoA", O_RDONLY)) == -1)
	{
		perror("open myfifoA error");
		return -1;
	}

	//打开文件B,myfifoB为A向B传输的信息
	if((fdB = open("./myfifoB", O_WRONLY)) == -1)
	{
		perror("open myfifoB error");
		return -1;
	}

	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子线程写数据
		while(1)
		{
			//向管道B中写数据
			//从终端向bufB中写数据
			fgets(bufB, sizeof(bufB), stdin);
			//清'\n'
			bufB[strlen(bufB)-1] = '\0';
			//写入管道
			write(fdB, bufB, strlen(bufB));
			//退出
			if(strcmp(bufB, "quit") == 0)
				break;
		}
		exit(EXIT_SUCCESS);
	}else
	{
		//父进程读数据
		while(1)
		{
			//读取管道A中的数据
			//清bufA
			memset(bufA, 0, sizeof(bufA));
			//读数据
			read(fdA, bufA, sizeof(bufA));
			if(strcmp(bufA, "quit") == 0)
				break;
			printf("B->A: %s \n", bufA);
		}
		wait(NULL);
	}
	//关闭文件
	close(fdA);
	close(fdB);
	return 0;
}

------------------------------------B.c------------------------------------

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//定义文件描述符
	int fdA,fdB;
	//定义一个子线程
	pid_t pid = fork();

	//定义容器
	char bufA[128] = "", bufB[128] = "";

	//打开文件A,myfifoA为B向A传输的信息
	if((fdA = open("./myfifoA", O_WRONLY)) == -1)
	{
		perror("open myfifoA error");
		return -1;
	}

	//打开文件B,myfifoB为A向B传输的信息
	if((fdB = open("./myfifoB", O_RDONLY)) == -1)
	{
		perror("open myfifoB error");
		return -1;
	}

	if(pid < 0)
	{
		perror("fork error");
		return -1;
	}else if(pid == 0)
	{
		//子线程写数据
		while(1)
		{
			//向管道A中写数据
			//从终端向bufA中写数据
			fgets(bufA, sizeof(bufA), stdin);
			//清'\n'
			bufA[strlen(bufA)-1] = '\0';
			//写入管道
			write(fdA, bufA, strlen(bufA));
			//退出
			if(strcmp(bufA, "quit") == 0)
				break;
		}
		exit(EXIT_SUCCESS);
	}else
	{
		//父进程读数据
		while(1)
		{
			//读取管道B中的数据
			//清bufB
			memset(bufB, 0, sizeof(bufB));
			//读数据
			read(fdB, bufB, sizeof(bufB));
			if(strcmp(bufB, "quit") == 0)
				break;
			printf("A->B: %s \n", bufB);
		}
		wait(NULL);
	}
	//关闭文件
	close(fdA);
	close(fdB);
	return 0;
}

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值