我在杭州的Day30_进程间通信(IPC)——20240805
创始人
2024-11-03 23:10:41
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> 程序运行效果

二、思维导图

相关内容

热门资讯

科技实测!斗牛房间怎么创建的老... 微信游戏中心:老神兽/皇豪互众房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
IA解析/牛牛房卡出售新鸿狐大... 新鸿狐大厅/随意玩是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:3...
秒懂教程!微信怎么开牛牛房间,... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
IA解析/牛牛房卡官网光明联盟... IA解析/牛牛房卡官网光明联盟/房卡最便宜的中心Sa9Ix苹果iPhone 17手机即将进入量产阶段...
一分钟推荐“微信链接金花房卡怎... 新荣耀是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来...
重大通报,牛牛房卡出售星驰娱乐... 您好!微信星驰娱乐大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(星驰娱乐)大厅介绍:...
秒懂教程!微信群牛牛房间买房卡... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...
秒懂教程“牛牛链接房卡找谁购买... 新永和是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享...
正版授权!游戏推荐斗牛房卡出售... 您好!微信超稳众娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(超稳众娱)大厅介绍:...
秒懂教程!炸金花房卡链接在哪买... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程“微信斗牛房卡怎么买”... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
玩家攻略,牛牛房卡制作链接九尾... 微信游戏中心:九尾大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
秒懂教程!微信牛牛房卡专卖店联... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
终于找到“开牛牛群怎么买房卡”... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
一分钟了解!金花房卡官网九天大... 一分钟了解!金花房卡官网九天大厅/房卡购买批发价格Sa9Ix苹果iPhone 17手机即将进入量产阶...
头条推荐!怎么买斗牛房卡火星大... 您好!微信火星大厅/新道游大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(火星大厅/新...
重大通报,游戏推荐斗牛房卡出售... 今 日消息,泡泡娱乐房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
秒懂教程!玩拼三张房卡从哪里买... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
终于找到“微信群金花房卡哪里可... 人皇大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
推荐一款!游戏推荐牛牛房卡出售... 久久大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...