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 特権) で実行されている場合、別のプログラムを実行する前にそれらを「オフ」にするのが普通です。何をすべきかを他のプログラムに依存するのは...ばかげています。