在本机C / C ++中生成的进程的标准输入和输出的跨平台重定向(使用解决方案编辑)

我有一个字符串命令,我想在写入其输入并读取其输出时异步执行。 听起来很简单,对,魔鬼在跨平台。 我的目标是MSVC / Win32和gcc / Linux,显然想要编写最少量的平台特定代码。 我的google-fu失败了,我的查询噪音太大,所以我从我所知道的开始。

popen – 简单易用,返回FILE *,易于随处消费。 但这是MSDN对_popen的评价 :

如果在Windows程序中使用,_popen函数将返回一个无效的文件指针,该指针会导致程序无限期地停止响应。 _popen在控制台应用程序中正常工作。 要创建重定向输入和输出的Windows应用程序,请参阅在Platform SDK中创建具有重定向输入和输出的子进程。

所以popen是不可能的(编辑:因为我希望我的代码在GUI应用程序中工作)。 在我看来,Windows的方式是相当丑陋和冗长的。 我可以使用平台特定的spawn代码,但我希望至少I / O代码是相同的。 然而,在这里,我在WinAPI HANDLE和C FILE*以及int文件描述符之间碰壁。 有没有办法将HANDLE “转换”为FILE*int fd,反之亦然? (谷歌再次在这个问题上失败了,我尝试的所有关键词都被过度使用了)

有没有更好的方法来完成整个小平台特定代码?

外部库不是不可能的,但是依赖性维护是一种痛苦,尤其是在多个平台上,因此我希望减少依赖性。 我也没有在boost中找到这样的库。


只是为了记录,最终对我有用。 在Windows / MSVC上, CreatePipe() + CreateProcess()如此处所述,使用_open_osfhandle()后跟_fdopen()来获取进程输入和输出的FILE* 。 在Linux / GCC上,没有什么新东西,创建pipe() s; fork()然后dup2()管道; exec() ; 相关文件描述符上的fdopen() 。 这样,只有进程生成代码是依赖于平台的(这是正常的,因为在Windows上我想控制其他STARTUPINFO参数),写入输入和读取输出是通过标准FILE*和相关函数完成的。

将Windows HANDLE转换为C文件描述符使用_open_osfhandle http://msdn.microsoft.com/en-us/library/bdts1c9x%28VS.71%29.aspx

编辑:这个例子曾经帮我解决过类似的问题: http : //www.halcyon.com/~ast/dload/guicon.htm

给libexecstream一个旋转。 它是跨平台的,允许您以C ++样式流的forms异步捕获进程的输入,输出和错误流。

我已经在Linux,Darwin和Windows上使用它,它似乎工作。 它也非常轻巧,因此可以轻松地集成到项目中,并拥有相当开放的BSD许可证。 我认为没有任何方法可以使用库(除了为每个平台编写自己的变体)。