2017-08-28 9 views
0

2つのスレッドを持つ単純なapplicationを書きました。最初のスレッドはstdoutに、2番目のスレッドはstdinから読み込み中です。stderr、stdout、stdinをパイプにリダイレクトするとプロセスが実行されない

私はプロセスのstdin、stdout、stdinを以下の3つの異なるパイプにリダイレクトしました。

cat < pipe_out & 
cat < pipe_err & 
cat > pipe_in 

はなぜ、このアプリケーションがブロックされている:私は下記行うまで

mkfifo pipe_in && mkifo pipe_out && mkfifo pipe_err 

./a.out < pipe_in 2> pipe_err 1> pipe_out & 

問題は、私は、このアプリケーション(./a.out)実行がブロックされていることでしょうか?それは他の側からの体がpipeを開いていないからですか?

完全にブロックされていない状態でアプリケーションを実行したいという問題の回避策を教えてください。私は、ユーザー入力がブロックされ、他のスレッドが実行を継続するのを待っているスレッドのみを必要とします。

このアプリケーションは起動時に起動します。したがって、このアプリケーションは、ユーザーの入力をブロックすることなく実行する必要があります。ユーザーはいつでも "cat> pipe_in"を使用して入力を開始し、このアプリケーションに関するいくつかの詳細を取得できます。

+0

"回避策" - er、なぜあなたのアプリケーションの残りはブロックされるのですか?スレッドは別のものです... – o11c

+0

デーモンを作成している場合は、stdioをまったく使用するのではなく、情報を提供するためにソケットを開く必要があります。 – o11c

+0

@ o11c:これはデアモンのようなものですが、このアプリケーションに関する情報を得るためのユーザ入力を得るためのインタフェースを備えています。特定のものをチェックするためのテストモードの種類。 – avltree

答えて

1

リダイレクトは、アプリケーションプログラムを起動する前にシェルによって実行されます。したがって、a.outは開始せず、パイプのオープンが完了し、パイプの書き込み側(1と2用)のオープンが読み取り側が開くまで完了しない限り、何もしないスレッドを作成することはできません。 (0の読み取り側のオープンはすぐに完了します)

関連する問題