【虚拟机】方便快捷了解管道通信

2020-06-09  本文已影响0人  秣禾

[实验目的]

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] 一端只能进行读操作,不能反过来使用。要实现双向数据传输,可以使用两个管道。

  1. 父进程调用pipe函数创建管道,得到两个文件描述符fd[0]、fd[1]指向管道的读端和写端。
  2. 父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
上一篇下一篇

猜你喜欢

热点阅读