1

重複の可能性:
system() コマンドから stdout をキャプチャして別の関数に渡すための最良の方法

システム関数を呼び出して別の実行可能ファイルを実行する C のプログラムがあります。ファイルではなく、コンソールで他のプログラムの出力を取得するにはどうすればよいですか。このようなことはできますか?

4

3 に答える 3

1

はい。パイプを使用します。各プロセスには、stdout と stderr という 2 つの標準ストリームがあります。これらは単なる 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

質問は、「コンソールで他のプログラムの出力を取得するにはどうすればよいですか...」という単純なものでした。

簡単な答えは、他のプログラムが stdout に書き込むことです。

2 番目のプログラムの出力を最初のプログラムに戻すには、より複雑な回答が必要です。

于 2012-07-09T14:36:30.783 に答える
0

popen別のプログラムを実行し、その出力への FILE* インターフェイスを提供するので、ファイルを読んでいるかのように読むことができます。コマンドを実行し、POSIX を使用して C++ 内でコマンドの出力を取得する方法を参照してください。

于 2012-07-09T14:23:12.147 に答える