有名管道FIFO,进行双进程的“双向通信”

本文介绍了一种使用有名管道FIFO实现的双进程双向通信机制,通过两个进程之间的交互,一旦任一方发送或接收quit信号,通信即刻终止。代码详细展示了如何在Linux环境下创建、打开和操作有名管道。

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

更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

本篇记录应用有名管道FIFO,进行双进程的“双向通信”,并当某一方收到/发送“quit”马上结束通信,具体代码如下:

进程一:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
	int ret;
	if(access("/home/gec/jiajia/1.txt",F_OK))					//判断文件是否存在,固定参数F_OK
	{
		ret = mkfifo("/home/gec/jiajia/1.txt",0666);					//不存在则创建
		if(ret == -1)
		{
			perror("创建有名管道失败!\n");
			return -1;
		}
	}
	
	int fifo1 = open("/home/gec/jiajia/1.txt",O_RDWR);			//存在就直接打开
	if(fifo1 == -1)
	{
		perror("打开有名管道1失败!\n");
		return -1;
	}
	
	if(access("/home/gec/jiajia/2.txt",F_OK))					//判断文件是否存在,固定参数F_OK
	{
		ret = mkfifo("/home/gec/jiajia/2.txt",0666);					//不存在则创建
		if(ret == -1)
		{
			perror("创建有名管道失败!\n");
			return -1;
		}
	}
	
	int fifo2 = open("/home/gec/jiajia/2.txt",O_RDWR);			//存在就直接打开
	if(fifo2 == -1)
	{
		perror("打开有名管道2失败!\n");
		return -1;
	}
	
	char buf[50];
	
	while(1)
	{
		bzero(buf,50);
		printf("输入:");
		scanf("%s",buf);
		write(fifo1, buf ,50);									//从有名管道1中写入内容
		
		bzero(buf,50);
		read(fifo2, buf ,50);									//从有名管道2中读取内容
		if(strcmp(buf,"quit")==0)								//判断是否接受到quit
		{
			write(fifo1, buf ,50);								//从有名管道1中写入内容
			break;
		}
		printf("输出:%s\n",buf);
	}
	close(fifo1);												//关闭有名管道1文件
	close(fifo2);												//关闭有名管道2文件
	return 0;
}

进程二

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
	int ret;
	if(access("/home/gec/jiajia/1.txt",F_OK))					//判断文件是否存在,固定参数F_OK
	{
		ret = mkfifo("/home/gec/jiajia/1.txt",0666);					//不存在则创建
		if(ret == -1)
		{
			perror("创建有名管道失败!\n");
			return -1;
		}
	}
	
	int fifo1 = open("/home/gec/jiajia/1.txt",O_RDWR);			//存在就直接打开
	if(fifo1 == -1)
	{
		perror("打开有名管道1失败!\n");
		return -1;
	}
	
	if(access("/home/gec/jiajia/2.txt",F_OK))					//判断文件是否存在,固定参数F_OK
	{
		ret = mkfifo("/home/gec/jiajia/2.txt",0666);					//不存在则创建
		if(ret == -1)
		{
			perror("创建有名管道失败!\n");
			return -1;
		}
	}
	
	int fifo2 = open("/home/gec/jiajia/2.txt",O_RDWR);			//存在就直接打开
		if(fifo2 == -1)
	{
		perror("打开有名管道2失败!\n");
		return -1;
	}
	
	char buf[50];
	
	while(1)
	{
		bzero(buf,50);
		read(fifo1, buf ,50);									//从有名管道1中读取内容
		if(strcmp(buf,"quit")==0)								//判断是否接受到quit
		{
			write(fifo2, buf ,50);								//从有名管道2中写入内容
			break;
		}
		printf("输出:%s\n",buf);
		
		bzero(buf,50);
		printf("输入:");
		scanf("%s",buf);
		write(fifo2, buf ,50);									//从有名管道2中写入内容
	}
	
	close(fifo1);												//关闭有名管道1文件
	close(fifo2);												//关闭有名管道2文件
	return 0;	
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳佳鸽

若文章帮到你,能不能请我喝杯茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值