0

私は UNIX システム コールとプロセス制御に取り組んでいます。vfork() が呼び出されると、制御が子プロセスに与えられ、子プロセスが完了すると _exit() が呼び出され、制御が親に渡されることを知っています。

質問1.は、「親プロセスの直後に子プロセスを実行に持ち込みたい」、、、可能ですか?

いいえの場合: vfork() の場合に親と子が同時に実行できる方法 ??? はいの場合: vfork() を使用する必要がある理由 (ほとんどの機能は fork() と同じです)

質問 2. fork と vfork の両方のプロセス構造を知っていますが、どちらをどこで使用すればよいかわかりませんか?

手伝ってください。

4

2 に答える 2

3

質問 2 に対する簡単な答えは次のとおりforkです。絶対に使用しないでくださいvfork

質問 1 で何を尋ねているのか正確にはわかりませんvfork。ed プロセスは 2 つのシステム コールしか使用できません:_exitexecve. (実際には、execファミリーのいずれかを使用できますexecveが、最も一般的なものです。) これらのいずれかを実行すると、デッド ( _exit) またはもはやvfork( exec*) ではなくなり、親はブロックされなくなります。したがって、子が新しい記憶イメージを取得すると、子と親は共存できます。

通常の場合、子は を呼び出そうとしexecveますが、失敗しない限り戻りません。その後すぐに を呼び出します。_exitこれは、 が失敗した場合にのみ発生しexecveます。

子は、子プロセスを適切に設定するためにしばしば必要となるdupまたはを呼び出すことができません。closeメモリを変更することはできません (メモリは親に属しているため)。そのため、ほとんど役に立ちません。

むかしむかし、プロセスの作成は遅かったです。最近では、はるかに高速であり、ほとんどの UNIX ライクな OS (Linux や FreeBSD を含む) は「コピー オン ライト」を使用しています。 . したがって、課せられた制限と提供される安全性の欠如vforkは、もはや役に立ちません。

vforkは 2008 年版で Posix から削除されたため、非推奨と見なす必要があります。

forkそれがパフォーマンスの問題であることが本当にわかった場合posix_spawnは、システムで使用できる場合は、使用を検討する必要があります。(私の知る限り、Linux の最近のバージョンで利用でき、FreeBSD と Solaris でかなり長い間利用できます。) 実際には を呼び出す可能性がありますvforkが、未定義の動作を引き起こすことなく、少なくとも詳細を処理します。

于 2013-08-17T17:10:30.970 に答える
2

質問 1. は、「親プロセスの直後に、子プロセスを実行に移したい」です。

それが目的ではないことは明らかvfork()です。ただし、これはシステム コールの exec グループ ( execlexecvなど) が行うことと似ていますが、子プロセスはスタンドアロンの実行可能ファイルでなければなりません。あることが別のことの後に起こるようにしたいだけなら、何かをフォークしたり実行したりする必要はなく、コードを正しい順序で配置するだけです;)

質問 2. fork と vfork の両方のプロセス構造を知っていますが、どちらをどこで使用すればよいかわかりませんか?

vfork()はより専門的で制限されているため、一般的には を使用しますfork()。Linux vfork の man ページは、その使用値についての手がかりを提供します。

vfork() は clone(2) の特殊なケースです。親プロセスのページテーブルをコピーせずに新しいプロセスを作成するために使用されます。 これは、すぐに execve(2) を発行する子が作成される、パフォーマンスが重要なアプリケーションで役立つ場合があります。

于 2013-08-17T16:30:03.197 に答える