目录
一、实验目的
二、实验预备知识
三、实验内容
四、实验结果分析
一、实验目的
(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!文章来源:https://www.toymoban.com/news/detail-430573.html
证明子进程1先从管道中读,然后子进程2再从管道中读。文章来源地址https://www.toymoban.com/news/detail-430573.html
到了这里,关于操作系统实验 进程的管道通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!