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

5
我将先简要介绍我的程序,然后再谈我的问题。我创建了一个双向管道,具体操作如下:
  1. 父进程将一个字符串值传递给子进程(在我的程序中,这个字符串值为“TEST DATA”);
  2. 子进程从父进程读取传递的数据并执行一个Python文件,该文件仅仅是将两个字符串连接在一起(从父进程接收到的字符串“TEST DATA”和“CHILD PROCESS: ”);
  3. 连接好的字符串被发送回父进程,父进程只需将它们打印出来。

    • 执行此程序后,输出结果如下:

parent process: CHILD PROCESS: TEST DATA

以下是我的 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
这里到底出了什么问题?如果你知道如何发送文本,那么发送文件有什么不同吗?你知道如何从文件中读取数据吗? - SergeyA
“write”函数只接受字符串作为其第二个参数。我不确定如何将文件内容传递给子进程@sergeyA,除非先读取文件内容,然后使用循环逐行发送。 - Maya
3
你做得很好!在一个循环中,你可以从文件中读取一个字符串,然后通过管道发送这个字符串。 - SergeyA
非常感谢您的帮助@sergeyA..所以我必须逐行发送文件内容吗?难道没有一种方法可以一次性发送整个文件吗?例如,如果Python代码需要读取整个文本文件以产生输出..那该怎么做呢? - Maya
1
在C程序中,您必须创建一个缓冲区来读取文件,然后将其发送到管道。如果缓冲区比文件小,则需要多次读取。管道可能无法一次性完全写入,因此您可能需要多次写入。通常使用外部循环读取一些数据,然后使用内部循环写入数据...然后重复此过程,直到文件传输完成。 - tdelaney
@tdelaney说得很有道理!非常感谢你! - Maya
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接