1

子プロセスがユーザー入力を待っているかどうかを調べようとしています (出力を解析せずに)。Unix の C で、パイプの読み取り側に現在 read() 呼び出しがブロックされているかどうかを判断することは可能ですか?

問題は、子プロセスで実行されるプログラムを制御できないことです。それらは、私が通常 /dev/null にリダイレクトしたいあらゆる種類の冗長なガベージを出力します。時折、ユーザーに何かを求めるプロンプトが表示されます。(プロンプトには信頼できる形式がありません。)したがって、私の考えは次のとおりです。

  • ループ内:
    • 子の stdout を排出し、一時バッファに追加します。
    • 子がユーザー入力を求めているかどうかを確認します (方法はわかりません)。その場合、バッファーは標準出力に出力されます。
  • 子が終了したら、バッファを破棄します。
4

6 に答える 6

1

問題は、子プロセスで実行されるプログラムを制御できないことです。それらは、私が通常/ dev/nullにリダイレクトしたいあらゆる種類の冗長なガベージを出力します。場合によっては、ユーザーに何かを求めるプロンプトが表示されることもあります。(プロンプトには信頼できる形式がありません。)したがって、私の考えは次のとおりです。

  • ループ内:
    • 子のstdoutを排出し、一時バッファーに追加します。
    • 子がユーザー入力を要求しているかどうかを確認します(方法はわかりません)。その場合、バッファーはstdoutに出力されます。
  • 子が終了したら、バッファを破棄します。
于 2009-01-16T18:37:47.157 に答える
1

次のオプションがあります。

  • 子が特定の入力(コマンドを読み取るシェルなど)を必要とすることがわかっている場合は、パイプに書き込むだけです。
  • 子が通常は何も読み取らないと想定しているが、時々読み取る場合は、シェルでのジョブ制御のようなものが必要になる可能性があります(子との通信にターミナルを使用し、ターミナルでプロセスグループとTIOCSPGRPioctlを使用して子をバックグラウンドに移動します。子はターミナルから読み取ろうとするとSIGTTINを取得し、それを待つことができます()。これは、bashが「(sleep 10; read a;)&」のようなものを処理する方法です
  • 何を書くべきかわからない場合、またはより多くの可能性がある場合は、出力を解析する必要があります
于 2009-01-18T16:26:17.523 に答える
1

これは、dpkg を監視しようとしているかのように聞こえます。ここでは、post-inst スクリプトが管理者に、構成ファイルを上書きする可能性があるかどうかを問い合わせることがあります。

とにかく、strace がどのように機能するかを確認したい場合があります。

strace -f -etrace=read your.program

もちろん、どの fds があなたが書いたパイプであるかを追跡する必要がありますが、いずれにせよ、おそらく stdin だけが必要です。

于 2009-01-20T14:14:37.787 に答える
0

私はそれが真実ではないと思います: たとえば、リーダー側で read() を呼び出す直前に、パイプには実際には読み取っていないリーダーがあります。

于 2009-01-16T11:22:59.957 に答える
0

通常は、パイプに書き込むか、select または poll を使用します。ハンドシェイクメカニズムが必要な場合は、さまざまな方法で帯域外で行うか、帯域内プロトコルを考え出すことができます。

相手側のリーダーがブロックしているかどうかを知る組み込みの方法があるかどうかはわかりません。なぜこれを知る必要があるのですか?

于 2009-01-16T12:51:30.677 に答える
-1

私の記憶が正しければ、リーダーのないパイプを持つことはできません。つまり、read(2) または select(2) syscal が常に保留中です。

于 2009-01-16T11:19:08.810 に答える