sbk*_*sbk 8 c c++ cross-platform native io-redirection
我有一个字符串命令,我想在写入其输入并读取其输出时异步执行.听起来很简单,对,魔鬼在跨平台.我的目标是MSVC/Win32和gcc/Linux,显然想要编写最少量的平台特定代码.我的google-fu失败了,我的查询噪音太大,所以我从我所知道的开始.
popen - 简单易用,返回FILE*,易于随处消费.但这是MSDN对_popen的评价:
如果在Windows程序中使用,_popen函数将返回一个无效的文件指针,该指针会导致程序无限期地停止响应._popen在控制台应用程序中正常工作.要创建重定向输入和输出的Windows应用程序,请参阅在Platform SDK中创建具有重定向输入和输出的子进程.
所以popen是不可能的(编辑:因为我希望我的代码在GUI应用程序中工作).在我看来,Windows的方式是相当丑陋和冗长的.我可以使用特定于平台的产生代码,但我希望至少I/O代码是相同的.然而,在这里,我在WinAPI HANDLE和C FILE*以及int文件描述符之间碰壁.有没有办法"转换"一HANDLE到FILE*或intFD或反之亦然?(谷歌再次在这个问题上失败了,我尝试的所有关键词都被过度使用了)
有没有更好的方法来完成整个小平台特定代码?
外部库不是不可能的,但是依赖性维护是一种痛苦,尤其是在多个平台上,因此我希望减少依赖性.我也没有在boost中找到这样的库.
只是为了记录,最终对我有用.在Windows/MSVC,CreatePipe()+ CreateProcess()所概述这里,使用_open_osfhandle()之后_fdopen()获得FILE*的过程输入和输出.在Linux/GCC上,这里没什么新东西,创造了pipe()s; fork()然后dup2()管道; exec(); fdopen()在相关的文件描述符上.这样,只有进程产生代码是依赖于平台的(这是好的,因为在Windows上我想控制其他STARTUPINFO参数),写入输入和读取输出是通过标准FILE*和相关函数完成的.
给libexecstream一个旋转.它是跨平台的,允许您以C++样式流的形式异步捕获进程的输入,输出和错误流.
我已经在Linux,Darwin和Windows上使用它,它似乎工作.它也非常轻巧,因此可以轻松集成到项目中,并拥有相当开放的BSD许可证.我认为没有办法使用库(除了为每个平台编写自己的变体).
要将 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