我在杭州的Day30_进程间通信(IPC)——20240805
创始人
2024-11-04 00:04:46
0

一、相关练习

1.使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

1.1> 01homework.c

#include   int main(int argc, const char *argv[]) { 	//创建一个有名管道 	if(mkfifo("./pipe", 0664) == -1) 	{ 		perror("mkfifo error"); 		return -1; 	} 	 	//定义通信容器 	char buf[128] = "";  	//创建父子进程 	pid_t pid = fork(); 	if(pid < 0) 	{ 		perror("fork error"); 		return -1; 	}else if(pid > 0) 	{ 		//子进程 		//以读的形式打开文件     	int rfd = open("./pipe", O_RDONLY);     	if(rfd == -1)     	{         perror("open error");         return -1;     	 		} 		//已追加形式打开要写入文件 		int dfd = open("./test.txt", O_WRONLY|O_APPEND|O_CREAT, 0664); 		if(dfd == -1) 		{ 			perror("open dfd error"); 			return -1; 		} 	    printf("管道文件读端打开\n");         	while(1)     	{         	bzero(buf, sizeof(buf));         	//读取数据         	read(rfd, buf, sizeof(buf));         	if(strcmp(buf, "quit") == 0)         	{             	break;         	}         	printf("收到消息为:%s\n", buf);  			//将读取到的数据写入目标文件 			write(dfd, buf, strlen(buf)); 			write(dfd, "\n", sizeof("\n"));     	}  		//关闭文件 		close(rfd); 		close(dfd);  		//退出进程 		exit(EXIT_SUCCESS); 	}  	//以写的形式打开管道文件 	int wfd = open("./pipe", O_WRONLY); 	if(wfd == -1) 	{ 		perror("open wfd error"); 		return -1; 	} 	printf("管道文件写端打开\n"); 	usleep(10);  	while(1) 	{ 		usleep(10); 		bzero(buf, sizeof(buf));  		printf("请输入>>>"); 		fgets(buf, sizeof(buf), stdin); 		buf[strlen(buf)-1] = 0; 		//写入数据 		write(wfd, buf, strlen(buf));  		//终止判断 		if(strcmp(buf, "quit") == 0) 		{ 			break; 		} 	}  	//回收进程资源 	wait(NULL);  	//关闭写端 	close(wfd);  	//删除管道文件 	system("rm pipe");  	return 0; } 

1.2> 程序运行效果

2.使用有名管道实现两个进程间相互通信

2.1> creat.c

#include   int main(int argc, const char *argv[]) { 	//创建管道文件 	if(mkfifo("./pipe1", 0664) == -1) 	{ 		perror("mkfifo pipe1 error"); 		return -1; 	} 	if(mkfifo("./pipe2", 0664) == -1) 	{ 		perror("mkfifo pipe2 error"); 	}  	getchar();  	//删除管道文件 	system("rm pipe1"); 	system("rm pipe2");  	return 0; } 

2.2> fork_a.c

#include   int main(int argc, const char *argv[]) { 	//创建通信中间变量 	char buf[128] = "";  	//创建父子进程 	pid_t pid = fork(); 	if(pid < 0) 	{ 		perror("fork error"); 		return -1; 	}else if(pid == 0) 	{ 		//子进程 		//以只读的形式打开管道文件2 		int rfd = open("./pipe2", O_RDONLY); 		if(rfd == -1) 		{ 			perror("pipe2 open error"); 			return -1; 		}  		//读取管道文件2中的数据 		while (1) 		{ 			bzero(buf, sizeof(buf)); 			read(rfd, buf, sizeof(buf)); 			if(strcmp(buf, "quit") == 0) 			{ 				//退出聊天 				printf("B已经退出聊天,请输入“quit”退出聊天\n"); 				break; 			} 			printf("收到B的消息:%s\n", buf); 		} 		 		//关闭文件描述符 		close(rfd);  		//退出子进程 		exit(EXIT_SUCCESS); 	}  	//以只写的形式打开管道文件1 	int wfd = open("./pipe1", O_WRONLY); 	if(wfd == -1) 	{ 		perror("pipe1 open error"); 		return -1; 	}  	//向管道文件1中写入数据 	while(1) 	{ 		bzero(buf, sizeof(buf));			//清空容器 		printf("向B发送消息:"); 		fgets(buf, sizeof(buf), stdin);		//从标准输入中读取数据 		putchar(10); 		buf[strlen(buf)-1] = 0;				//去掉换行符 		write(wfd, buf, strlen(buf));		//向管道文件1中写入数据 		if(strcmp(buf, "quit") == 0)		//如果输入的是quit,则退出聊天 		{ 			break; 		} 	}  	//回收子进程 	wait(NULL);  	//关闭文件描述符 	close(wfd);  	return 0; } 

2.3> fork_b.c

#include   int main(int argc, const char *argv[]) { 	//创建通信中间变量 	char buf[128] = "";  	//创建父子进程 	pid_t pid = fork(); 	if(pid < 0) 	{ 		perror("fork error"); 		return -1; 	}else if(pid == 0) 	{ 		//子进程 		//以只读的形式打开管道文件2 		int rfd = open("./pipe1", O_RDONLY); 		if(rfd == -1) 		{ 			perror("pipe2 open error"); 			return -1; 		}  		//读取管道文件2中的数据 		while (1) 		{ 			bzero(buf, sizeof(buf)); 			read(rfd, buf, sizeof(buf)); 			if(strcmp(buf, "quit") == 0) 			{ 				//退出聊天 				printf("A已经退出聊天,请输入“quit”退出聊天\n"); 				break; 			} 			printf("收到A的消息:%s\n", buf); 		} 		 		//关闭文件描述符 		close(rfd);  		//退出子进程 		exit(EXIT_SUCCESS); 	}  	//以只写的形式打开管道文件1 	int wfd = open("./pipe2", O_WRONLY); 	if(wfd == -1) 	{ 		perror("pipe1 open error"); 		return -1; 	}  	//向管道文件1中写入数据 	while(1) 	{ 		bzero(buf, sizeof(buf));			//清空容器 		printf("向A发送消息:"); 		fgets(buf, sizeof(buf), stdin);		//从标准输入中读取数据 		putchar(10); 		buf[strlen(buf)-1] = 0;				//去掉换行符 		write(wfd, buf, strlen(buf));		//向管道文件1中写入数据 		if(strcmp(buf, "quit") == 0)		//如果输入的是quit,则退出聊天 		{ 			break; 		} 	}  	//回收子进程 	wait(NULL);  	//关闭文件描述符 	close(wfd);  	return 0; } 

2.4> 程序运行效果

二、思维导图

相关内容

热门资讯

技巧辅助挂!pokermast... 技巧辅助挂!pokermaster修改器,丹东约战麻将辅助器,演示教程(有挂细节)1、点击下载安装,...
现场直击!wepokerplu... 现场直击!wepokerplus万能挂,丰城双剑新版最强高分攻略,操作教程(有挂方针)1.丰城双剑新...
插件辅助挂!wepoker有辅... 插件辅助挂!wepoker有辅助器吗,乐平包王攻略,学习教程(有挂方略)1、首先打开乐平包王攻略辅助...
据玩家消息!拱趴大菠萝辅助神器... 据玩家消息!拱趴大菠萝辅助神器,多乐跑得快辅助器,机巧教程(证实有挂)1、在拱趴大菠萝辅助神器插件功...
此事备受玩家关注!来玩app破... 此事备受玩家关注!来玩app破解版,h5能反杀吗,绝活教程(有挂详细)1、打开软件启动之后找到中间准...
值得注意的是!aapoker破... 值得注意的是!aapoker破解侠是真的吗,蜀山四川游戏修改工具,经验教程(有挂助手)1、金币登录送...
第三方辅助!wepoker脚本... 第三方辅助!wepoker脚本,广东星悦有外开挂辅助器吗,法门教程(有挂分析)广东星悦有外开挂辅助器...
此事引发广泛关注!德州透视脚本... 此事引发广泛关注!德州透视脚本,崇阳斗棋辅助脚本视频,诀窍教程(的确有挂)暗藏猫腻,小编详细说明崇阳...
黑科技辅助挂!wepoker买... 黑科技辅助挂!wepoker买脚本靠谱吗,情怀七喜游戏辅助,法门教程(有挂方法)1、每一步都需要思考...
方法辅助挂!aapoker怎么... 方法辅助挂!aapoker怎么设置提高好牌几率,蘑菇云辅助使用视频,绝活儿教程(讲解有挂)1、完成蘑...