栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

操作系统-父子进程通信-c语言编程实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

操作系统-父子进程通信-c语言编程实现

创建父子2个进程A,B。进程A不断获取用户从键盘输入的字符串或整数,通过信号机制传给进程B。如果输入的是字符串,进程B将其打印出来;如果输入的是整数,进程B将其累加起来,并输出该数和累加的和。当累加和大于100时结束子进程,子进程输出“My work done!”后结束,然后父进程也结束。编写程序实现,并给出测试结果。

#include 
#include 
#include 
#include 
#include 

main(){
	int r, p, fd1[2], fd2[2];
	char buf[50], s[50], massr[50];
	char flag[50] = "My work is dong!";
	char massw[50] = "My work done!";
	int i = 0, sum = 0, num = 0;
	pipe(fd1);		//父进程建立管道
	pipe(fd2);
	while((p = fork()) == -1);	
	if(p == 0){		//由子进程P1返回,执行子进程P1
		close(fd1[1]);		//关闭管道1写入端 
		close(fd2[0]);		//关闭管道2读出端
		write(fd2[1], flag, 50);
		while(read(fd1[0], s, 50)){
			while(s[i] >= '0' &&s[i] <= '9'){
				i++;
			}
			if(i == strlen(s)){
				num = atoi(s);
				sum += num;
				printf ("message is number : %dn", num);
				printf ("sum of number : %dn", sum);
				if(sum > 100){
					write(fd2[1], massw, 50);
					printf ("My work done!n");
					sleep(1);
					break;
				}else{
					write(fd2[1], flag, 50);
					sleep(1);
				}	
			}else{
				printf ("message of child process receive:n");
				printf ("%sn", s);
				write(fd2[1], flag, 50);
				sleep(1);
			}	 
		}
		exit(0);     //关闭 	
	}else{
		close(fd1[0]);
		close(fd2[1]);
		while(read(fd2[0], massr, 50)){
			if(strcmp(massr, "My work done!") == 0) {
				printf ("receive My work done, program is exiting!n");
				break;
			}else{
				printf ("please input your message!n");
				scanf("%s", buf);
				write(fd1[1], buf, 50);	//把buf中的50个字符写入管道 
				sleep(1);		//睡眠5秒,让子进程读
			}
		}
		printf ("exited!n");
		exit(0);	
	}
	
} 

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/510277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号