C Win32 API中的Posix popen()等效于什么?

C Win32 API中的Posix popen()等效于什么?,c,linux,winapi,api,posix,C,Linux,Winapi,Api,Posix,Win32 API中是否有与Linux/Unix stdio.h popen()函数大致相同的函数?如果是,我在哪里可以找到它 编辑:我需要知道这一点来修补D标准库中的一个遗漏。任何答案都必须仅使用标准Win32 API,不使用MSVC特定函数。另外,如果存在的话,我更喜欢不是非常低级的东西。如果您正在编写控制台应用程序,可以调用\u popen。有关更多信息,请参阅MSDN网站上的文档:MSDN解释了如何使用中的Windows API实现popen的功能。它提供了一个详细的例子。它比Jason

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


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

如果您正在编写控制台应用程序,可以调用
\u popen
。有关更多信息,请参阅MSDN网站上的文档:

MSDN解释了如何使用中的Windows API实现popen的功能。它提供了一个详细的例子。它比Jason链接的运行库中的
\u popen
函数要低级得多,但只使用Win32 API

不幸的是,这并不特别容易

您需要使用win32函数(CreatePipe)创建一个管道,然后通常需要复制给子流程的管道末端(DuplicateHandle),以允许它被继承,否则它将不会被继承,因此无法使用

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


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

挖掘旧线程


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

这是一篇老文章,但几年前我还需要在Windows环境中使用like调用。正如回答中的一些评论所指出的,使用Windows API实现任何接近经典POSIX
popen()的功能)
很有趣

我创建了一个提交给的实现。此实现使用
管道
stdin
和from
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窗口弹出窗口的情况下执行此操作。缓冲区会根据需要增长以适应响应的大小。

哦,我比我更喜欢这个答案:)它看起来非常有趣,如果我没有在交付截止日期晚2天,我可能会对实现此解决方案感兴趣:-)。但是为了满足我的需要(我只想捕获stdout),
\u popen
就足够了。你忘了发布MSDN页面的链接了吗?这个有充分证明的例子在哪里?我也喜欢你的,伙计。我认为这正好符合那个家伙的要求:)\u popen是Windows上标准C库的一部分,任何链接到/使用标准C库的人都可以使用它。好吧,我似乎无法从支持C ABI的D上运行它,但这可能超出了这个问题的范围。Windows不是Linux;操作系统中没有标准的C库。KERNEL32.DLL没有printf()