2016-06-11 15 views
1

私は記事を読んでいましたが、次のように読んでいます:外部コマンドを実行して終了するまで待つとします。私たちは永遠に待たずに、タイムアウトを設定してから子プロセスを終了させたいと思っています。これを行う方法?コマンドを実行するには、fork(2)とexecve(2)を使用します。特定のプロセスが終了するのを待つために、waitpid(2)関数を使うことができますが、タイムアウトパラメータはありません。また、sleep(3)を引数としてタイムアウトを指定してsleep(3)をSIGCHLDシグナルで中断するというループを作成することもできます。この解決策はほとんど...これには競合条件が含まれます。プロセスがすぐに終了した場合、sleep(3)を呼び出す前に、タイムアウトが切れるまで待機します。以前に説明したものと同様のレースです。システムコールはどのように中断されますか?子プロセスは親プロセスまたはシステムコールsleep(3)にシグナルを送信しますか?私はシステムコールが実行を停止し、親プロセスに渡す方法を取得しません、システムコールは別のプロセスのようですか?シグナルがシステムコールを中断する方法

答えて

1

すべてのベストをタイムアウト文献を使用することができますか?子プロセスは親プロセスまたはシステムコールsleep(3)にシグナルを送信しますか?

子プロセスがシステムコール終了を実行する(2)、そこexit_notify()そこからdo_notify_parent()からカーネル関数do_exit()は、親にSIGCHLDを送信し、__wake_up_parent()を呼び出す、と呼ばれています。

私はシステムコールの実行を停止し、親プロセス に渡しますが、システムコールは別のプロセスと同様ですか?

システムコールの基礎となるsleep()は、呼び出しプロセスを状態TASK_INTERRUPTIBLEに置きます。 g。 Sleeping in the Kernel。その後、プロセスは、上記の__wake_up_parent()で起床するまで、またはタイムアウトまでスケジュールされません。

1

gnu popen Ref gnu libc Pipe to a Subprocessを使用して子をフォークすることができます。

これは、あなたがリセットアラームにできることからを停止したい場合に役立つかもしれません。

そして

アラームsetitimerが機能を使用するには、将来的に自分自身を中断するためのプロセスのためのメカニズムを提供します。彼らはタイマーを設定することでこれを行います。タイマーが満了すると、プロセスは信号を受信する。

NBあなたは上記

ポータビリティはexecve前に注意呼び出します。アラーム機能がで指定されている間、setitimerがgetitimer関数はBSD Unixの由来しているのPOSIX.1標準。 setitimerは、アラームより強力ですが、アラームがより広く使用されます

参考libc Setting Alarm

またman timeout part of coreutils

にシステムコールが中断されたどのよう

関連する問題