Ho sempre imparato che il processo init è l'antenato di tutti i processi. Perché il processo 2 ha un PPID pari a 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]
Risposta accettata:
Innanzitutto, "antenato" non è la stessa cosa di "genitore". L'antenato può essere il genitore del genitore … il genitore del genitore e il kernel tiene traccia di un solo livello.
Tuttavia, quando un processo muore, i suoi figli vengono adottati da init, quindi vedrai molti processi il cui genitore è 1 su un sistema tipico.
I moderni sistemi Linux hanno inoltre alcuni processi che eseguono il codice del kernel, ma sono gestiti come processi utente, per quanto riguarda la pianificazione. (Non obbediscono alle normali regole di gestione della memoria poiché eseguono il codice del kernel.) Questi processi sono tutti generati da kthreadd
(è l'inizializzazione dei thread del kernel). Puoi riconoscerli dal loro ID processo padre (2) o, di solito, dal fatto che ps
li elenca con un nome tra parentesi quadre o dal fatto che /proc/2/exe
(normalmente un collegamento simbolico all'eseguibile del processo) non può essere letto.
Processi 1 (init
) e 2 (kthreadd
) vengono creati direttamente dal kernel al momento dell'avvio, quindi non hanno un genitore. Il valore 0 viene utilizzato nel loro campo ppid per indicarlo. Pensa a 0 come a "il kernel stesso" qui.
Linux ha anche alcune funzionalità per il kernel per avviare processi utente la cui posizione è indicata tramite un parametro sysctl in determinate circostanze. Ad esempio, il kernel può attivare eventi di caricamento dei moduli (ad esempio quando viene scoperto nuovo hardware o quando vengono utilizzati per la prima volta alcuni protocolli di rete) chiamando il programma in kernel.modprobe
valore sysctl. Quando un programma esegue il dump del core, il kernel chiama il programma indicato da kernel.core_pattern
se presente.