在Win32 API中等效于Posix popen()是什么?

时间:2009-01-16 15:54:27

标签: c linux winapi api posix

Win32 API中是否存在与Linux / Unix stdio.h popen()函数大致相同的内容?如果是这样,我在哪里可以找到它?

编辑:我需要知道这一点来修补D标准库中的遗漏。任何答案都必须使用标准的Win32 API,而不是MSVC特定的功能。另外,如果存在的话,我更喜欢低级别的东西。

5 个答案:

答案 0 :(得分:20)

MSDN解释了如何在Pipe Handle Inheritance中使用Windows API执行popen所做的工作。 Here它提供了一个记录良好的例子。它比Jason链接的运行时库中的_popen函数更低级,但仅使用Win32 API。

答案 1 :(得分:17)

如果您正在编写控制台应用程序,则可以调用_popen。有关详细信息,请参阅MSDN站点上的文档:http://msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx

答案 2 :(得分:4)

可悲的是,这并不是特别容易。

您需要使用win32函数(CreatePipe)创建管道,然后通常需要复制您为子进程提供的管道末尾(DuplicateHandle)以允许它继承,否则它赢了“ t be因此无法使用。

然后你需要使用CreateProcess创建一个进程(它需要很多结构指针,包括一个STARTUPINFO),并将你已复制的句柄传递给STARTUPINFO作为其标准输出。

然后你可以从管道的读取端(ReadFile等)读取,直到你到达eof,然后你需要通过关闭所有各种win32句柄进行清理。

答案 3 :(得分:1)

挖掘旧线程......

对Jason Coco上面的回复做出反应,与链接的MSDN页面声称的相反,现在显然有可能从非控制台应用程序调用_popen()。我从QuickTime导入器组件调用它,基本上是伪装的DLL。它会打开一个控制台窗口,但会显示预期的行为。使用mingw32的-mwindows选项编译标准控制台工具以使其成为GUI应用程序,_popen继续正常工作(但即使从另一个控制台运行该工具,也会打开控制台窗口。

答案 4 :(得分:1)

这是一篇旧文章,但几年前,我还需要在Windows环境中使用类似popen()的调用。正如这里答案中的一些评论所指出的那样,使用Windows API实现接近经典POSIX popen()的任何事物都是很有趣的。

我创建了一个提交给Code Review 的实现。此实现使用pipesstdin以及从stdout开始使用CreateProcess(...)的Windows方法。

链接的代码旨在通过很小的API内置到dll中。

int __declspec(dllexport) cmd_rsp(const char *command, char **chunk, unsigned int size); 

简单用法示例:

#include "cmd_rsp.h"
int main(void)
{
    char *buf = {0};
    buf = calloc(100, 1);
    if(!buf)return 0;
    cmd_rsp("dir /s", &buf, 100);
    printf("%s", buf);
    free(buf);
    //or a custom exe
    char *buf2 = {0};
    buf2 = calloc(100, 1);
    cmd_rsp("some_custom_program.exe arg_1 arg_2 arg_n", &buf2, 100);
    printf("%s", buf2);
    free(buf2);
    
    return 0;
}

它接受例如可以从stdin发出的任何命令,创建一个单独的过程来执行该命令,然后将所有响应内容(如果有)返回到缓冲区,并且执行此操作而不显示CMD窗口弹出。缓冲区会根据需要增长,以适应响应的大小。