call(argv) 関数内のコード フラグメント
if '|' in argv:
# Split argv into two commands, lst[0] and lst[1]
r,w=os.pipe()
pid=fork()
# Parent
if pid >0:
os.close(w)
os.dup2(r,0)
run(lst[0])
os.close(r)
os.wait()
# Child
if pid==0:
os.close(r)
os.dup2(w,1)
run(lst[1])
os.close(w)
os._exit(1)
上記のコードは、2 つのコマンドのみの単純なパイプラインから結果を返しますが、シェルが途中で終了する原因になります。このコードを取得してスクリプトの終了を停止し、コマンド プロンプトに戻すにはどうすればよいですか?
プログラムの仕組み
子は 2 番目のコマンドを実行します。その出力は、パイプに沿って出力をリダイレクトする dup2() 呼び出しを使用してパイプに送信されます。これは、値 sys.stdout を使用してパイプライン書き込みファイル記述子を変更することによって実現されます。
次に、親は dup2() 呼び出しで入力リダイレクトを使用します。これにより、スクリプトが終了した直後に画面に表示される最終出力が生成されます。
run 関数呼び出しは、コマンドとその引数を受け取ります。指定されたコマンドを実行します。また、グロビングと入力および出力のリダイレクトも実行します。
おそらく単純なことですが、問題の原因を特定できないようです...