我在杭州的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> 程序运行效果

二、思维导图

相关内容

热门资讯

透视代打!wpk辅助购买(透视... 透视代打!wpk辅助购买(透视)辅助下载(本来是真的有挂)-哔哩哔哩1、进入到是否有挂之后,能看到左...
备受关注的!摸一把花牌辅助!好... 备受关注的!摸一把花牌辅助!好像是真的辅助安装(有挂功能)-哔哩哔哩;在进入摸一把花牌辅助软件靠谱后...
透视曝光!wpk显示有作弊,w... 透视曝光!wpk显示有作弊,wpk透视工作室-真是一直总是有辅助神器(哔哩哔哩)辅助器是一种具有地方...
反观!来玩app破解版(透视)... 反观!来玩app破解版(透视)辅助修改器(真是有挂)-哔哩哔哩1、超多福利:超高返利,海量正版游戏,...
必备攻略!hhpoker有辅助... 必备攻略!hhpoker有辅助吗,wpk作弊是真的吗,科普教程(有挂细节)-哔哩哔哩1、上手简单,内...
据了解!青鸟辅助安卓!好像真的... 据了解!青鸟辅助安卓!好像真的是有辅助修改器(真的有挂)-哔哩哔哩;所有人都在同一条线上,像星星一样...
透视揭露!pokemmo手机脚... 透视揭露!pokemmo手机脚本,约局吧是否有挂-竟然一直都是有辅助脚本(哔哩哔哩)1、进入游戏-大...
于此同时!wpk辅助是什么(透... 于此同时!wpk辅助是什么(透视)辅助辅助(确实有挂)-哔哩哔哩1. 选牌创建新账号,点击进入游戏后...
最新消息!wepoker破解版... 最新消息!wepoker破解版内购(透视)辅助神器(真实有挂)-哔哩哔哩1、点击下载安装,wepok...
科技通报!来玩app破解版,w... 科技通报!来玩app破解版,wepoker有没有透视方法,有挂教程(有挂秘诀)-哔哩哔哩所有人都在同...