在可执行文件之间传输数据

时间:2013-02-07 12:15:35

标签: c++ windows process data-sharing

我在Windows上用C ++编写了两个可执行文件。我在一个中生成一些数据,并希望调用另一个可执行文件来处理这些数据。我可以将数据写入文件,然后在其他可执行文件中读取它,但就磁盘I / O而言,这似乎相当昂贵。这样做的更好方法是什么?这似乎是一个简单的问题,但谷歌只是没有帮助!

假设数据大约为100MB,并且在需要发送之前完整生成(即不需要流式传输)。

混合使用32位和64位进程时可以获得奖励积分的答案。

3 个答案:

答案 0 :(得分:5)

如果您的流程可以轻松写入和读取文件,请继续。使用CreateFile创建文件并将其标记为临时&共享。 Windows使用此提示来延迟物理写入,但仍遵循所有文件语义。由于您的文件只有100 MB并且正在使用,因此Windows几乎肯定能够将其内容完全保存在RAM中。

答案 1 :(得分:3)

您可以使用Boost.MPI。它来自Boost,它具有高质量标准,代码示例似乎很明确:

http://www.boost.org/doc/libs/1_53_0/doc/html/mpi/tutorial.html#mpi.point_to_point

// The following program uses two MPI processes to write "Hello, world!"
// to the screen (hello_world.cpp):

int main(int argc, char* argv[])
{
  mpi::environment env(argc, argv);
  mpi::communicator world;

  if (world.rank() == 0) {
    world.send(1, 0, std::string("Hello"));
    std::string msg;
    world.recv(1, 1, msg);
    std::cout << msg << "!" << std::endl;
  } else {
    std::string msg;
    world.recv(0, 0, msg);
    std::cout << msg << ", ";
    std::cout.flush();
    world.send(0, 1, std::string("world"));
  }
  return 0;
}

答案 2 :(得分:1)

假设您只想“向一个方向”(也就是说,您不需要从子进程获取数据),您可以使用_popen()。您将数据写入管道,子进程从stdin读取数据。

如果您需要双向数据流,那么您将需要使用两个管道,一个作为输入,一个作为输出,您将需要设置子进程如何连接到这些管道的方案[您仍然可以将stdin / stdout设置为数据路径,但您也可以使用一对命名管道]。

第三个选项是shared memory区域。我在Windows中从未这样做过,但其原理与我在Linux中使用的原理几乎相同[多年前在OS / 2中]: 1.在父进程中创建具有给定名称的内存区域。 2.子进程打开相同的内存区域。 3.数据由父进程存储,并由子进程读取。 4.如有必要,信号量或类似信号可用于表示完成/结果就绪/等。