操作系统实验 进程的管道通信

目录

一、实验目的

二、实验预备知识

三、实验内容

四、实验结果分析


一、实验目的

(1)了解Linux系统中进程通信的基本原理。

(2)了解和掌握管道通信机制。

二、实验预备知识

(1)管道的概念:管道是一种先入先出的、单向的、大小固定的通信通道。写进程在管道的一端写入数据,读进程从管道的另一端读出数据。如果两个或多个进程同时对一个进程进行读写,那么这些进程必须使用锁机制或者信号量机制对其进行同步。

(2)管道的分类:管道分为无名管道和有名管道。无名管道没有名字,所以只能提供给进程家族中的父子进程间通信使用,而有名管道则用于没有家族关系的任意两个进程之间的通信。

(3)管道的创建:

pipe (int fd[]);

这个函数创建一个管道,以便通过文件描述符 int fd[] 来访问:fd[0] 为管道的读出端,而 fd[1] 为管道的写入端。UNIX 将管道作为一种特殊类型的文件。因此,访问管道可以采用普通的系统调用 read() 和 write()。

         从管道中读

read(fd[]);

          从管道中写

write(fd[]);

三、实验内容

编写一段程序,实现进程的管道通信。使用系统调用pipe( )建立一条管道,创建两个子进程P1和P2。 父进程向管道写入两句话:

Child1 receive   message1!

Child2 receive  message2!

让P1和P2从分别从管道中读出来自于父进程的信息,显示在屏幕上。

要求进程P1先接受父进程发来的消息1,然后进程P2再接受父发来的消息2。 

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<signal.h>
main()
{
	pid_t pid1,pid2,pid;
	int fd[2];
	char outpipe[100],inpipe[100];
	pipe(fd);                                 //创建一个管道
	pid=fork();
	if(pid==0)                                //父进程写
	{
		sprintf(outpipe,"Child1 receive message1!");    //把字符放入outpipe数组中
		write(fd[1],outpipe,50);             //向管道中写长为50字节的字符
		sprintf(outpipe,"Child2 receive message2!");
		write(fd2[1],outpipe,50);
		exit(0);
	}
	pid1=fork();
	if(pid1==0)                                //子进程1读
	{
		sleep(1);    //睡眠
		read(fd[0],inpipe,50);            //从管道中读长为50字节的字符
		printf("\nI'm a child process1.\n");
		printf("%s\n",inpipe);
		exit(0);	
	}
	pid2=fork();
	if(pid2==0)                                //子进程2读
	{
		sleep(2);    
		read(fd[0],inpipe,50);
		printf("I'm a child process2.\n");
		printf("%s\n",inpipe);
		exit(0);
	}
}

以上程序中,用sleep()控制子进程1和子进程2从管道中读的先后顺序,达成了实验目的。

四、实验结果分析

可以看出,先出现 

I'm a child process1.
Child1 receive message1!

后出现

I'm a child process2.
Child2 receive message2!

证明子进程1先从管道中读,然后子进程2再从管道中读。

  • 3
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EMT00923

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

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

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

打赏作者

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

抵扣说明:

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

余额充值