12

fork()Unix が新しいプロセスを作成する理由がわかりません。Win32 API ではCreateProcess()、新しいプロセスを作成し、実行可能ファイルをそのアドレス空間にロードしてから、エントリ ポイントから実行を開始します。しかし、Unix は新しいプロセスを作成するための fork を提供しています。別のプロセスを実行したいのに、なぜプロセスを複製する必要があるのか​​ わかりません。

そこで、次の 2 つの質問をさせてください。

  1. fork()and thenがより効率的である場合、ほぼすべての場合にafterを呼び出すためexec()、関数がないのはなぜですか?forkexec(const char *newProc)exec()fork()
  2. より効率的でない場合、なぜfork()存在するのでしょうか?
4

3 に答える 3

13

fork()通話で十分です。また、より柔軟です。プロセスを作成するためのシステム コールを複雑にするのではなく、子プロセスの I/O リダイレクションを調整することができます。SUID または SGID プログラムを使用すると、子プロセスが他のプロセスを実行する前に昇格された特権を失うことができます。

プロセスを作成する複雑な方法が必要な場合は、posix_spawn()関数を参照してください。

#include <spawn.h>

int posix_spawn(pid_t *restrict pid, const char *restrict path,
        const posix_spawn_file_actions_t *file_actions,
        const posix_spawnattr_t *restrict attrp,
        char *const argv[restrict], char *const envp[restrict]);

int posix_spawnp(pid_t *restrict pid, const char *restrict file,
          const posix_spawn_file_actions_t *file_actions,
       const posix_spawnattr_t *restrict attrp,
       char *const argv[restrict], char *const envp[restrict]);

違いはposix_spawnp()、実行可能ファイルの PATH を検索することです。

posix_spawn_file_actions_t処理とタイプのための他の関数の完全なセットがありposix_spawnattr_tます (参照されているマニュアル ページの下部にある「参照」リンクに従ってください)。

これは、Windows にかなり似CreateProcess()ています。ただし、ほとんどの場合、fork()続いてすぐに使用するexec()方が簡単です。


意味がわかりません。if (fork() == 0)子プロセスのコードは私が書くので、このコードを書くことと、このコードを child の先頭に置くことの違いは何main()ですか?

多くの場合、実行するコードは自分が作成したものではないため、子プロセスの開始時に何が起こるかを変更することはできません。シェルについて考えてみてください。シェルから実行するプログラムが自分で作成したものだけである場合、生活は非常に貧しくなります。

多くの場合、実行するコードはさまざまな場所から呼び出されます。特に、パイプラインで実行されることもあれば、パイプなしで実行されることもあるシェルとプログラムについて考えてみてください。呼び出されたプログラムは、どの I/O リダイレクトとフィックスアップを行うべきかを知ることができません。呼び出しプログラムは知っています。

呼び出し元のプログラムが昇格された特権 (SUID または SGID 特権) で実行されている場合、別のプログラムを実行する前にそれらを「オフ」にするのが普通です。何をすべきかを他のプログラムに依存するのは...ばかげています。

于 2011-10-15T19:48:42.493 に答える
3

UNIX ライクなオペレーティング システム (少なくとも新しい Linux および BSD カーネル) は、一般に非常に効率的な fork実装を備えています。一部の言語では、これに基づく「スレッド化された」実装が存在するほど「安価」です。

最後に、forkexec関数は ~n -- n の小さな値の場合 -- アプリケーション コードの行です。

Windowsがこんなに便利だったらいいのにと思いますForkProcess:(

ハッピーコーディング。


言及された cnicutar、Copy-On-Write (COW)は、使用される 1 つの戦略です。

于 2011-10-15T19:47:29.063 に答える