代码之家  ›  专栏  ›  技术社区  ›  sbk

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

  •  8
  • sbk  · 技术社区  · 16 年前

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

    波彭 -又好又简单,返回容易在任何地方使用的文件*。但这里是什么 MSDN have to say about _popen :

    如果在Windows程序中使用, _ popen函数返回一个无效的文件指针,导致程序 无限期地停止响应。 _ Popen在控制台应用程序中正常工作。创建窗口 重定向输入和 输出,请参见创建子进程 带重定向输入和输出输入 平台SDK。

    因此,Popen是不可能的(编辑:因为我希望我的代码在GUI应用程序中工作)。在我看来,窗户的做法相当难看和冗长。我可以使用平台特定的衍生代码,但我希望至少I/O代码是相同的。然而,在这里,我碰到了WinAPI之间的一堵墙 HANDLE S和C FILE* int 文件描述符。有“转换”的方法吗 把手 文件* int fd或反之亦然?(谷歌又一次让我失望了,我试过的所有关键词都被滥用了)

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

    外部库并不是不可能的,但是依赖性维护是一个难题,特别是在多个平台上,所以我想减少依赖性。我也没有在Boost中找到这样的图书馆。


    只是为了记录,最终对我有用的是什么。在Windows/MSVC上, CreatePipe() + CreateProcess() 概述 here 使用 _open_osfhandle() 然后 _fdopen() 得到 文件* 过程输入和输出。在Linux/GCC上,这里没有什么新内容,创建 pipe() S; fork() 然后 dup2() 管道; exec() ; fdopen() 在相关的文件描述符上。这样,只有进程生成代码依赖于平台(这是可以的,在Windows上,我想控制其他 STARTUPINFO 参数),写入输入和读取输出通过标准 文件* 以及相关功能。

    2 回复  |  直到 16 年前
        1
  •  2
  •   smerlin    16 年前

    用于转换窗口 HANDLE S到C文件描述符使用 _open_osfhandle http://msdn.microsoft.com/en-us/library/bdts1c9x%28VS.71%29.aspx

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

        2
  •  6
  •   Adam Bowen    16 年前

    给予 libexecstream 一阵旋风。它是跨平台的,允许您将进程的输入、输出和错误流作为C++样式流异步捕获。

    我在linux、darwin和windows上使用过它,它似乎可以工作。它也相当轻,因此集成到项目中的成本很低,并且具有相当开放的BSD许可证。我认为没有任何方法可以使用库(除了为每个平台编写自己的变体)。