我有一个 C 语言程序,我在其中调用系统函数来运行不同的可执行文件。如何在控制台而不是文件上获取其他程序的输出。可以做这样的事情吗?
问问题
500 次
3 回答
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;
}
于 2012-07-09T14:27:47.240 回答
0
问题很简单,“我如何在控制台上获得其他程序的输出......”
简单的答案是让其他程序写入标准输出。
需要更好的答案才能将第二个程序的输出传递回第一个程序。
于 2012-07-09T14:36:30.783 回答
0
popen
运行另一个程序并为您提供一个 FILE* 接口到它的输出,因此您可以像读取文件一样读取它,请参阅如何使用 POSIX 在 C++ 中执行命令并获取命令的输出?
于 2012-07-09T14:23:12.147 回答