嵌入式:IO Day7

 使用多进程管道实现相互通信功能

源码:

demo1.c

//demo1.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//创建两个有名管道
	if((mkfifo("./myfifo_u1_u2", 0664)) == -1){
		perror("mkfifo_u1_u2 error");
		return -1;
	}

	if((mkfifo("./myfifo_u2_u1", 0664)) == -1){
		perror("mkfifo_u2_u1 error");
		return -1;
	}

	//阻塞主函数
	getchar();

	//删除管道
	system("rm myfifo_u1_u2");
	system("rm myfifo_u2_u1");
	return 0;
}

 u1_u2.c

//u1_u2.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//定义两个文件描述符
	int fd1, fd2;
	//以两个不同的权限打开文件
	if((fd1 = open("./myfifo_u1_u2", O_WRONLY)) == -1){
		perror("open myfifo_u1_u2 error");
		return -1;
	}
	
	if((fd2 = open("./myfifo_u2_u1", O_RDONLY)) == -1){
		perror("open myfifo_u2_u1 error");
		return -1;
	}

	//创建进程
	pid_t pid = fork();

	if(pid < 0){
		perror("pid error");
		return -1;
	}else if(pid > 0){
		//父进程写第一个文件
		while(1){
			char buf[128];
			fgets(buf, sizeof(buf), stdin);
			buf[strlen(buf) - 1] = '\0';
			write(fd1, buf, strlen(buf));
			//判断是否输入quit退出
			if((strcmp(buf, "quit")) == 0){
				break;
			}
		}
		//关闭文件描述符
		close(fd1);
	}else{
		//子进程读第二个文件
		while(1){
			char buf[128] = "";
			read(fd2, buf, sizeof(buf));
			printf("[u2]: %s\n", buf);
			//判断是否输入quit退出
			if((strcmp(buf, "quit")) == 0){
				break;
			}
		}
		//关闭文件描述符
		close(fd2);
	}

	return 0;
}

u2_u1.c

//u2_u1.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	//定义两个文件描述符
	int fd1, fd2;
	//以两个不同的权限打开文件
	if((fd1 = open("./myfifo_u1_u2", O_RDONLY)) == -1){
		perror("open myfifo_u1_u2 error");
		return -1;
	}
	
	if((fd2 = open("./myfifo_u2_u1", O_WRONLY)) == -1){
		perror("open myfifo_u2_u1 error");
		return -1;
	}

	//创建线程
	pid_t pid = fork();

	if(pid < 0){
		perror("pid error");
		return -1;
	}else if(pid > 0){
		//父进程读第一个文件
		while(1){
			char buf[128] = "";
			read(fd1, buf, sizeof(buf));
			printf("[u1]: %s\n", buf);
			//判断是否输入quit退出
			if((strcmp(buf, "quit")) == 0){
				break;
			}
		}
		//关闭文件描述符
		close(fd1);
	}else{
		//子进程写第二个文件
		while(1){
			char buf[128];
			fgets(buf, sizeof(buf), stdin);
			buf[strlen(buf) - 1] = '\0';
			write(fd2, buf, strlen(buf));
			//判断是否输入quit退出
			if((strcmp(buf, "quit")) == 0){
				break;
			}
		}
		//关闭文件描述符
		close(fd2);
	}

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值