2016-04-24 15 views
1

ある時点で子をフォークするコードがあります。 子のみのコードはscanfです。 scanfの 3に入力待ち 1) 2を実行している))終了のため子PIDがScanfを待っているか確認してください

チェックを終了するかしないのwaitpidとWNOHANGと最も単純な: 親プロセスは、TISの子プロセスの状態を監視する必要があります。問題は、子プロセスが入力を待っているかどうかを区別する方法がわからないことです。

PS:私のケースでは、子から親に情報を送信できないという制限があります。さもなければ、私はscanfの前後に変数を使うことができます。

PS:私は子プロセスが(一般的にまたはIO)のscanf入力待ちの状態で入力された場合にどのように確認することができますlinuxの下

よ?

+0

達成しようとしていることを説明した方が良いでしょう。これは奇妙なことですが、解決したい実際の問題に対するより良い解決策があります。 –

+0

私は編集します。先端に感謝します。 – Psyny

答えて

1

プロセスとIOの概念は、一般的論理和です。親PIDに送信され、子に伝播するunix(kill)シグナルを除いて、子プロセスと親プロセスの間で交換されるシグナルはありません。

Waitpidは、子供のpidの終了を待って、ステータスコードを返します。

親と子の間でデータを交換する場合は、両方のプロセスの間にpipeman -s 2 pipe参照)を作成する必要がある場合は、マニュアルページの例を参照してください。

あなたが子供にscanf(標準入力からの入力)を使用する場合は、標準入力ファイルディスクリプタ0(またはSTDIN_FILENO)にpipefd[0]をバインドする必要があります。

親プロセスでselectまたはpollを使用して、親が送信したデータをpipefd[1]に読み取る準備ができているかどうかを確認できます。

あなたがprintfか(例えばSTDOUT_FILENO経由)子に書き込むためのいくつかの他のstdio.hメソッドを使用する場合は、親のIOは、selectまたはpollは子供がデータを受信する準備ができていると言われていても、とにかくブロックされることがあります子供が遅すぎると読んでも早すぎると出力バッファがいっぱいである(これは4096バイトのデフォルトサイズを持っています。)子供は、入力の多く(nbytes)バイトを読んでいない場合

unistd.h書き込み呼び出しが

nw = write(pipefd[1], buffer, nbytes); 

nw < nbytes値を返すことがあります。

したがって、非同期通信を行うときはトリップの危険性に注意してください。非同期メソッドを理解したときに、同期通信を使用する通信とは異なる、より安定したアプローチとしてCSP(通信シーケンシャルプロセス)方式をチェックしてください。

+0

解決に感謝します。私はパイプでいくつかの精巣を動かして、それは私の問題を解決するようです。また、IOとプロセスの私のコンセプトは間違っていました。この答えは私の考えを整理するのに役立ちました。 – Psyny

1

<Windows.h>をお使いですか?これはあなたが探しているものですか?

WaitForInputIdle

待ち指定されたプロセスは、その最初の入力を処理し、保留中の入力をユーザ入力を待っている、またはタイムアウト間隔が経過するまで完了するまで。 APIについて

HANDLE hProc; 
// get hProc here 
WaitForInputIdle(hProc, INFINITE); // wait forever until input idle 
// do something here 

詳細情報はここで見つけることができます: https://msdn.microsoft.com/en-us/library/windows/desktop/ms687022(v=vs.85).aspx

+0

申し訳ありませんが定義されていません。私はLinuxの下にいる。 私は同等のものを見つけようとします、ありがとう! – Psyny

関連する問題