我有两个在Windows上使用C ++编写的可执行文件。 我在一个生成一些数据,并想调用其他可执行文件来处理这些数据。 我可以将数据写入文件,然后在另一个可执行文件中读取数据,但是在磁盘I / O方面,这似乎相当昂贵。 有什么更好的方法呢? 这似乎是一个简单的问题,但谷歌只是没有帮助!
假设数据大概是100MB,并且在需要发送之前全部生成(即不需要stream式传输)。
在混合32位和64位进程时工作的答案可以获得加分。
如果你的进程可以很容易地写入和读取文件,那就继续吧。 使用CreateFile
创建文件并将其标记为临时&可共享。 Windows使用这个提示来延迟物理写入,但是所有的文件语义仍然被遵守。 由于您的文件只有100 MB,并且正在使用,所以Windows几乎肯定能够将其内容保留在RAM中。
你可以使用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; }
假设你只想去“单向”(也就是说,你不需要从子进程获取数据),你可以使用_popen()
。 您将数据写入管道,子进程从stdin
读取数据。
如果你需要双向的数据流,那么你将需要使用两个管道,一个作为输入,一个作为输出,你将需要建立一个子进程如何连接到这些管道的方案[你仍然可以设置stdin / stdout是数据路径,但是你也可以使用一对命名管道]。
第三个选项是共享内存区域。 我从来没有在Windows中这样做过,但是这个原理和我在Linux中使用的很相似(在OS / 2中很多年):1.在父进程中创建一个具有给定名称的内存区域。 2.子进程打开相同的内存区域。 3.数据由父进程存储并由子进程读取。 4.必要时,可以使用信号灯或类似信号来表示完成/结果准备好等。