【问题标题】:Passing file contents through a bidirectional pipe通过双向管道传递文件内容
【发布时间】:2016-04-05 16:32:42
【问题描述】:

我将首先简要解释我的程序,然后我将转到我的问题。 我创建了一个双向管道,它执行以下操作:

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

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

父进程:子进程:测试数据

这些是我的 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),而是我想发送整个内容文本文件.. 有什么提示吗?

【问题讨论】:

  • 究竟是什么给您带来了问题?如果您知道如何发送文本,那么发送文件有何不同?你知道如何从文件中读取数据吗?
  • “write”函数只接受字符串值作为它的第二个参数。我不确定如何将文件内容传递给子进程@sergeyA 除非可以先读取文件内容然后使用循环分别发送每一行?
  • 你成功了!在一个循环中,你可以从文件中读取一个字符串,然后通过管道发送这个字符串。
  • 非常感谢您的帮助@sergeyA .. 所以我必须逐行发送文件内容?反正没有一次发送整个文件吗?例如,如果 python 代码需要读取整个文本文件以产生输出.. 那怎么做?
  • 在 C 程序中,您必须创建一个缓冲区来读取文件,然后将其发送到管道。如果缓冲区小于文件,则需要多次读取。管道可能无法一次性完成全部写入,因此您可能需要多次写入。这通常通过读取一些数据的外部循环然后写入数据的内部循环来完成......然后重复直到文件传输完成。

标签: python c++ unix pipe


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多