繁体   English   中英

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

[英]Cross-platform redirect of standard input and output of spawned process in native C/C++ (edit with solution)

我有一个字符串命令,我想在写入其输入和读取其输出时异步执行。 听起来很容易,对,魔鬼在跨平台中。 我的目标是同时使用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*int fd,反之亦然? (Google再次使我失败了,我尝试过的所有关键字都被过度使用了)

有没有更好的方法可以用很少的平台特定代码来完成整个工作?

外部库并不是没有问题,但是依赖关系维护很麻烦,尤其是在多个平台上,因此我想减少依赖关系。 我也没有在Boost中找到这样的库。


仅作记录,最终对我有用。 在Windows / MSVC, CreatePipe() + CreateProcess()作为概括这里 ,使用_open_osfhandle()然后_fdopen()获得FILE*的过程输入和输出。 在Linux / GCC上,这里没有新内容,创建pipe() fork()然后dup2()管道; exec() ; 有关文件描述符的fdopen() 这样,只有进程产生代码是平台相关的(没关系,就像Windows一样,我想控制其他STARTUPINFO参数),写入输入和读取输出是通过标准FILE*和相关功能完成的。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM