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

时间:2012-07-09 14:16:58

标签: c

  

可能重复:
  Best way to capture stdout from a system() command so it can be passed to another function

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

3 个答案:

答案 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。

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