实现一个管道通信程序

0. 相关博客

实现一个模拟的shell_ 一只博客-CSDN博客_操作系统实验模拟shellhttps://blog.csdn.net/qq_42276781/article/details/98521603利用Linux的消息队列通信机制实现两个线程间的通信_ 一只博客-CSDN博客_杭电操作系统实验三https://blog.csdn.net/qq_42276781/article/details/90672038利用Linux的共享内存通信机制实现两个进程间的通信_ 一只博客-CSDN博客_利用linux的共享内存通信机制实现两个进程间的通信https://blog.csdn.net/qq_42276781/article/details/98519201

1. 实现一个管道通信程序

       由父进程创建一个管道,然后再创建三个子进程,并由这三个子进程利用管道与父进程之间进行通信:子进程发送消息,父进程等待三个子进程全部发完消息后再接收信息。通信的具体内容可根据自己的需要随意设计,要求能试验阻塞型读写过程中的各种情况,测试管道的默认大小,并且要求利用Posix信号量机制实现进程间对管道的互斥访问。运行程序,观察各种情况下,进程实际读写的字节数以及进程阻塞唤醒的情况。

2. 原代码

无bug,可正常运行

3. 图片识别结果

有bug,无法直接运行,调试改bug过程中可以加深代码理解

test2.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<semaphore.h>
#include<fcntl.h>
sem_t *w,*r;
int main(){
	int filedis[2];
	pipe(filedis);
	char buf[256];
	char *name1="writer";
	char *name2="reader";
	int x,y;
	w=sem_open(name1,O_CREAT,0666,1);
	r=sem_open(name2,O_CREAT,0666,0);
	sem_getvalue(w,&x);
	if(x==0) sem_post(w);
	pid_t pid1,pid2,pid3;
	pid1=1;pid2=1;pid3=1;
	pid1=fork();
	if(pid1>0) pid2=fork();
	if(pid1>0&&pid2>0) pid3=fork();
	if(pid1==0){
		close(filedis[0]);
		sem_wait(w);
		printf("child process1 send message\n");
		write(filedis[1],"p1 ",strlen("p1 "));
		sem_post(w);
		sem_post(r);
		exit(0);
	}
	if(pid2==0){
		close(filedis[0]);
		sem_wait(w);
		printf("child process2 send message\n");
		write(filedis[1],"p2 ",strlen("p2 "));
		sem_post(w);
		sem_post(r);
		exit(0);
	}		
	if(pid3==0){
		close(filedis[0]);
		sem_wait(w);
		printf("child process2 send message\n");
		write(filedis[1],"p3 ",strlen("p3 "));
		sem_post(w);
		sem_post(r);
		exit(0);
	}
	if(pid1>0&&pid2>0&&pid3>0){
		sem_wait(r);
		sem_wait(r);
		sem_wait(r);
		sem_wait(w);
		printf("3 child process finish sending, the messages are:");
		close(filedis[1]);
		read(filedis[0],buf,sizeof(buf));
		printf("%s\n",buf);
		sem_post(w);
	}	
}

4. 代码及实验报告获取

关注公众号,回复“进程管理”即可获取代码

 

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Toblerone_Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值