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

目录

一、实验目的

二、实验预备知识

三、实验内容

四、实验结果分析


一、实验目的

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

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

二、实验预备知识

操作系统实验 进程的管道通信_第1张图片

(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
#include
#include
#include
#include
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从管道中读的先后顺序,达成了实验目的。

四、实验结果分析

操作系统实验 进程的管道通信_第2张图片

可以看出,先出现 

I'm a child process1.
Child1 receive message1!

后出现

I'm a child process2.
Child2 receive message2!

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

你可能感兴趣的:(操作系统,p2p,linq,网络协议)