[英]Is there a cross-platform solution in C++ for creating an unique process?
[英]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.