Vždy jsem se učil, že proces init je předkem všech procesů. Proč má proces 2 PPID 0?
$ ps -ef | head -n 3
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May14 ? 00:00:01 /sbin/init
root 2 0 0 May14 ? 00:00:00 [kthreadd]
Přijatá odpověď:
Za prvé, „předek“ není totéž jako „rodič“. Předkem může být rodič rodiče … rodič rodiče a jádro sleduje pouze jednu úroveň.
Když však proces zemře, jeho potomci jsou adoptováni init, takže uvidíte spoustu procesů, jejichž rodič je 1 na typickém systému.
Moderní linuxové systémy mají navíc několik procesů, které provádějí kód jádra, ale jsou spravovány jako uživatelské procesy, pokud jde o plánování. (Neposlouchají obvyklá pravidla správy paměti, protože používají kód jádra.) Všechny tyto procesy vytváří kthreadd
(je to init jaderných vláken). Poznáte je podle ID jejich nadřazeného procesu (2) nebo obvykle podle toho, že ps
uvádí je se jménem v hranatých závorkách nebo podle skutečnosti, že /proc/2/exe
(obvykle symbolický odkaz na spustitelný soubor procesu) nelze přečíst.
Procesy 1 (init
) a 2 (kthreadd
) jsou vytvářeny přímo jádrem při spouštění, takže nemají rodiče. Hodnota 0 se používá v jejich poli ppid k označení toho. Myslete na to, že 0 zde znamená „samotné jádro“.
Linux má také určitá zařízení pro jádro ke spouštění uživatelských procesů, jejichž umístění je za určitých okolností indikováno parametrem sysctl. Například jádro může spouštět události načítání modulu (např. když je objeven nový hardware nebo když jsou poprvé použity některé síťové protokoly) voláním programu v kernel.modprobe
hodnota sysctl. Když program vypíše jádro, jádro zavolá program označený kernel.core_pattern
pokud existuje.