[实验目的]
1、了解管道是什么
2、熟悉UNIX/LUNIX支持的管道通信方式
[实验内容]
编写一段程序,实现进程的管道通信。使用系统建立一条pipe(fd)管道线,两个子进程p1、p2分别向管道内各写一句话:
child 1 is sending a message!
child 2 is sending a message!
父进程从管道中读出来自于两个子进程的信息,并显示在屏幕上。
[实验代码]
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
int wait(int);
int main()
{
int i,r,p1,p2,fd[2];
char buf[50],s[50];
pipe(fd);
while((p1=fork())==-1);
if(p1==0)
{
printf("p1\n");
lockf(fd[1],1,0);
sprintf(buf,"chile 1 is sending a message! ");
write(fd[1],buf,50);
//sleep(5);
lockf(fd[1],0,0);
//exit(0);
}
else
{
while((p2=fork())==-1);
if(p2==0)
{
printf("p2\n");
lockf(fd[1],1,0);
sprintf(buf,"chile 2 is sending a message! ");
write(fd[1],buf,50);
//sleep(40000);
lockf(fd[1],0,0);
//exit(0);
}
else
{
printf("parent\n");
wait(0);
r=read(fd[0],s,50);
//printf("can't read!\n");
//else
printf("%s\n",s);
//wait(0);
r=read(fd[0],s,50);
//printf("can't read!\n");
// else
printf("%s\n",s);
//exit(0);
}
}
return 0;
}
[实验结果]
管道通信截图.png[结果分析]
通过pipe函数创建的这两个文件描述符 fd[0] 和 fd[1] 分别构成管道的两端,往 fd[1] 写入的数据可以从 fd[0] 读出。并且 fd[1] 一端只能进行写操作,fd[0] 一端只能进行读操作,不能反过来使用。要实现双向数据传输,可以使用两个管道。
- 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端。
- 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
网友评论