美文网首页
【虚拟机】方便快捷了解管道通信

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

作者: 秣禾 | 来源:发表于2020-06-09 20:48 被阅读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创建子进程,那么子进程也有两个文件描述符指向同一管道。

    相关文章

      网友评论

          本文标题:【虚拟机】方便快捷了解管道通信

          本文链接:https://www.haomeiwen.com/subject/coxizhtx.html