1

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

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

4

3 回答 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 回答