什么是相当于在Win32 API中的Posix popen()?
是否有相当于Win32 API中的Linux / Unix stdio.h popen()函数? 如果是的话,我在哪里可以find它?
编辑:我需要知道这个补丁D标准库中的遗漏。 任何答案只能使用标准的Win32 API,不能使用MSVC特定的函数。 另外,如果它存在的话,我更喜欢一些不太可怕的东西。
MSDN解释了如何使用Pipe Handle Inheritance中的Windows API来做什么。 这里提供了一个logging完整的例子。 这比Jason链接的运行时库中的_popen
函数更低级,但是只使用Win32 API。
如果您正在编写控制台应用程序,则可以调用_popen
。 有关详细信息,请参阅MSDN网站上的文档: http : //msdn.microsoft.com/en-us/library/96ayss4b(VS.80).aspx
可悲的是,这并不容易。
您需要使用win32函数(CreatePipe)创build一个pipe道,然后通常需要复制pipe道的末端(DuplicateHandle)给subprocess,以允许它被inheritance,否则将不会因此不能使用。
然后你需要使用CreateProcess创build一个进程(需要大量的结构指针,包括一个STARTUPINFO),然后传递STARTUPINFO这个你已经复制的句柄作为标准输出。
然后你可以读取pipe道的读端(ReadFile等),直到你到达eof,那么你需要通过closures所有的各种win32句柄来清理。
挖掘一个旧的线程…
对上面的Jason Coco的回复作出反应,与链接的MSDN页面声称相反,现在显然有可能从非控制台应用程序调用_popen()。 我从一个QuickTime导入器组件调用它,基本上是一个伪装的DLL。 它打开一个控制台窗口,但显示预期的行为。 使用mingw32的-mwindows选项编译标准控制台工具以使其成为GUI应用程序,_popen将继续正常工作(但是即使从另一个控制台运行该工具时也会打开控制台窗口。