3

サブプロセスを使用して Python でプロセスを生成しており、パイプを使用してプログラムから出力を読み取りたいと考えています。ただし、明示的に閉じるように指示しても、C++ プログラムはパイプを閉じないようです。

#include <cstdlib>
#include <ext/stdio_filebuf.h>
#include <iostream>

int main(int argc, char **argv) {
  int fd = atoi(argv[1]);
  __gnu_cxx::stdio_filebuf<char> buffer(fd, std::ios::out);
  std::ostream stream(&buffer);
  stream << "Hello World" << std::endl;
  buffer.close();
  return 0;
}

この小さなプログラムを次の Python スニペットで呼び出します。

import os                                                                                         
import subprocess                                                                                 

read, write = os.pipe()                                                                           
proc = subprocess.Popen(["./dummy", str(write)])                                                  
data = os.fdopen(read, "r").read()                                                                
print data                                                                                        

fd が閉じられていないため、read() メソッドは戻りません。Python で write fd を開いたり閉じたりすると、問題が解決します。しかし、それは私にはハックのようです。C++ プロセスで fd を閉じる方法はありますか?

どうもありがとう!

4

2 に答える 2

5

Linux (実際にはすべての POSIX OS) で子プロセスを生成するには、通常、forkとを使用しexecます。の後fork、両方のプロセスでファイルが開かれます。C++ プロセスはファイルを閉じますが、親プロセスが fd も閉じるまでファイルは開いたままです。これは を使用するコードでは正常でforkあり、通常は のラッパーによって処理されますforkmanのページを読んでくださいpipe。ただし、pythonはどのファイルが子に転送されているかを知る方法がないため、親プロセスと子プロセスで何を閉じるべきかわかりません。

于 2012-07-03T22:35:20.263 に答える
3

POSIXファイル記述子はプロセスに対してローカルです。Pythonツールのファイル記述子writeはC++プロセスでは無効です。

おそらく最も簡単な方法は、C ++プロセスにstdout(のようにcout <<)出力を書き込み、PythonでPopenusingstdout=PIPEとread proc.stdout(またはproc.communicate()usingの代わりにuse)を呼び出すことfdopenです。これはWindowsでも機能するはずです。

ファイル記述子をコマンドライン引数として渡す方法については、BenVoigtの回答を参照してください。

于 2012-07-03T22:29:39.073 に答える