使用系统函数获取另一个进程的输出而不使用文件

可能重复:
从system()命令捕获stdout的最佳方法,以便将其传递给另一个函数

我在C中有一个程序,我在其中调用一个系统函数来运行不同的可执行文件。 如何在控制台上获取其他程序的输出,而不是在文件上。 可以这样做吗?

是。 你用管道。 每个进程都有两个标准流 – stdout和stderr。 这些只是io流。 它们可以映射到文件或控制台管道。 当您生成新进程时,将新进程输出管道设置为重定向到控制进程上的文件句柄。 从那里你可以做任何你喜欢的事。 例如,您可以读取子进程管道并将其输出推送到控制进程输出管道。

在Windows中,你这样做:

#define SHANDLE HANDLE bool CmdShell::makePipe( SHANDLE& read, SHANDLE& write ) { SECURITY_ATTRIBUTES sa; sa.nLength = sizeof( SECURITY_ATTRIBUTES ); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = true; SHANDLE writeTmp; if ( !CreatePipe( &read, &writeTmp, &sa, 0 )) { assert(0); return false; } if ( !DuplicateHandle( GetCurrentProcess(), writeTmp, GetCurrentProcess(), &write, 0, FALSE, DUPLICATE_SAME_ACCESS )) { assert(0); return false; } CloseHandle( writeTmp ); return true; } 

在linux上你这样做:

 #define SHANDLE int bool CmdShell::makePipe( SHANDLE& read, SHANDLE& write ) { s32 pipeD[2]; if ( pipe( pipeD )) { assert(0); return false; } read = pipeD[0]; write = pipeD[1]; return true; } 

popen运行另一个程序并为它输出一个FILE *接口,这样你就可以像读取文件一样阅读它,参见如何执行命令并使用POSIX在C ++中获取命令输出?

问题简单地问道:“如何在控制台上获得其他程序的输出……”

简单的答案是让其他程序写入stdout。

需要更高级的答案才能将第二个程序的输出传递回第一个程序。