私の理解は、これがfork
親プロセスを複製して新しいプロセスを作成するシステムコールであるということです。親プロセスはどのように生成されますか? Cライブラリを使用して複数のプロセスを生成する場合、最初のプロセスを生成するためのシステムコールは何ですか?たとえば、実行時に./main.o
答え1
カーネル自体には、execve()
決して終了しないプロセス1(init)を生成する内部呼び出しが含まれています。
Init() はプロセスツリー全体のルートです。まず、すべての既知のサービスやその他の設定タスク、およびログインしているすべてのデバイスのプロセスを分岐します。
答え2
シェルでプログラムを実行すると、シェルが親プロセスになります。
シェル呼び出しはfork()
新しい子プロセスを作成し、その新しいプロセスの系列の1つを呼び出してexec()
プログラムの実行を開始します。
プログラムが他の(シェルではない)プロセスによって開始される場合、順序は同じです。
init
明らかにこれはどこかから始まるべきです。すべてのプロセスの究極の祖先は、カーネルによってユーザースペースを開始するために魔法のように始まるプロセス(PID 0)です。