可能重复:
Best way to capture stdout from a system() command so it can be passed to another function
我在C中有一个程序,我在其中调用系统函数来运行不同的可执行文件。如何在控制台上获取其他程序的输出,而不是在文件上。可以这样做吗?
答案 0 :(得分:1)
是。你用管道。每个进程都有两个标准流 - 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;
}
答案 1 :(得分:0)
popen
运行另一个程序,并为其输出一个FILE *界面,以便您可以像阅读文件一样阅读它,请参阅How to execute a command and get output of command within C++ using POSIX?
答案 2 :(得分:0)
问题很简单,“如何在控制台上获得其他程序的输出......”
简单的答案是让其他程序写入stdout。
需要更高级的答案才能将第二个程序的输出传递回第一个程序。