通过双向管道传递文件内容

时间:2015-12-31 19:33:29

标签: python c++ unix pipe

我首先简要介绍一下我的程序然后我会转到我的问题。 我创建了一个执行以下操作的双向管道:

  1. 父进程将字符串值传递给子进程(在我的程序中,字符串值为“TEST DATA”)
  2. 子进程从其父进程读取传递的数据并执行一个python文件,该文件只是将两个字符串连接在一起(从父进程“TEST DATA”接收到的字符串和“CHILD PROCESS:”)
  3. 附加的字符串被发送回父进程,只是将它们打印出来。

    • 执行此程序后,输出将如下所示:
  4.   

    父流程:儿童流程:测试数据

    这些是我的C ++和python程序代码:

    test.cc:

    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <cstdlib>
    
    int main()
    {
      int writepipe[2] = {-1,-1};// parent -> child
      int readpipe[2] = {-1,-1};//child -> parent
      pid_t childpid;
    
      if(pipe(readpipe) < 0 || pipe(writepipe) < 0)
        {
          //cannot create a pipe
          printf("error creating pipe");
          exit(-1);
        }
    #define PARENT_READ readpipe[0]
    #define CHILD_WRITE readpipe[1]
    #define CHILD_READ writepipe[0]
    #define PARENT_WRITE writepipe[1]
    
      if((childpid=fork())<0)
        {
          //cannot fork child
          printf("cannot fork child");
          exit(-1);
        }
      else if (childpid==0)
        {//child process
          close(PARENT_WRITE);
          close(PARENT_READ);
          dup2(CHILD_READ,0); //read data from pipe instead of stdin
          dup2(CHILD_WRITE , 1);//write data to pipe instead of stdout
          system("python test.py");
          close(CHILD_READ);
          close(CHILD_WRITE);
        }
      else
        {
          close(CHILD_READ);
          close(CHILD_WRITE);
          //do parent stuff
          write(PARENT_WRITE,"TEST DATA\n",23);
          int count;
          char buffer [40];
          count=read(PARENT_READ,buffer,40);
          printf("parent process: %s",buffer);
        }
      return 0;
    }
    

    test.py:

    import sys
    data=sys.stdin.readline()
    sys.stdout.write("CHILD PROCESS: "+data)
    

    我的问题是: 我有一个文本文件(让我们称之为test.txt),其中包含几行数据,我希望能够使用前面的代码而不是发送一个字符串值(TEST DATA)我想发送整个内容文本文件.. 任何提示?

1 个答案:

答案 0 :(得分:0)

在C程序中,您必须创建一个缓冲区来读取文件,然后将其发送到管道。如果缓冲区小于文件,则需要多次读取。管道可能无法完全写入一个gulp,因此您可能需要多次写入。这通常使用外部循环来读取一些数据,然后是内部循环来写入数据......然后重复直到文件传输完成。 - tdelaney