私の理解では、これはfork
親プロセスを複製して新しいプロセスを作成するシステムコールです。親プロセスを作成するのは何ですか?Cライブラリを使用して複数のプロセスを作成する場合、最初のプロセスを作成するシステムコールは何ですか?たとえば、./main.o
答え1
カーネル自体にはexecve()
、終了することのないプロセス 1 (init) を作成するための内部呼び出しが含まれています。
Init() はプロセス ツリー全体のルートです。すべての既知のサービスとその他の構成済みタスク、およびすべてのログイン デバイスのプロセスをフォークすることから始まります。
答え2
シェルからプログラムを実行する場合、シェルはその親プロセスになります。
シェルは を呼び出しfork()
て新しい子プロセスを作成し、その新しいプロセス内でexec()
ファミリの 1 つを呼び出してプログラムの実行を開始します。
プログラムが他の(シェル以外の)プロセスによって起動された場合、シーケンスはまったく同じです。
明らかに、これはどこかで開始する必要があります。すべてのプロセスの最終的な祖先はプロセスinit
(PID 0) であり、これはユーザー空間を開始するためにカーネルによって魔法のように開始されます。