Не так багато, щоб покласти тут тіло.
Не так багато, щоб покласти тут тіло.
Відповіді:
Процеси повинні мати батьківський (PPID). Ядро, не дивлячись на реальний процес, все-таки обробляє деякі реальні процеси, як-от принаймні init, і надає собі ідентифікатор процесу 0. Залежно від ОС воно може бути або не може відображатися як процес у ps
виході, але завжди відображається як PPID:
наприклад, у Linux:
$ ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:09 ? 00:00:00 /sbin/init
root 2 0 0 09:09 ? 00:00:00 [kthreadd]
root 3 2 0 09:09 ? 00:00:00 [ksoftirqd/0]
...
на Solaris:
$ ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 Oct 19 ? 0:01 sched
root 5 0 0 Oct 19 ? 11:20 zpool-rpool1
root 1 0 0 Oct 19 ? 0:13 /sbin/init
root 2 0 0 Oct 19 ? 0:07 pageout
root 3 0 1 Oct 19 ? 117:10 fsflush
root 341 1 0 Oct 19 ? 0:15 /usr/lib/hal/hald --daemon=yes
root 9 1 0 Oct 19 ? 0:59 /lib/svc/bin/svc.startd
...
Зауважте також, що pid 0
(та -1
інші негативні значення з цього приводу) мають різні значення залежно від того, яка функція їх використовує kill
, fork
і waitpid
.
Нарешті, хоча init
процес традиційно надається під #1
, це вже не той випадок, коли віртуалізація рівня ОС використовується як зони Solaris, оскільки тут може бути більше одного init
:
$ ps -ef|head
UID PID PPID C STIME TTY TIME CMD
root 4733 3949 0 11:07:25 ? 0:26 /lib/svc/bin/svc.configd
root 4731 3949 0 11:07:24 ? 0:06 /lib/svc/bin/svc.startd
root 3949 3949 0 11:07:14 ? 0:00 zsched
daemon 4856 3949 0 11:07:46 ? 0:00 /lib/crypto/kcfd
root 4573 3949 0 11:07:23 ? 0:00 /usr/sbin/init
netcfg 4790 3949 0 11:07:34 ? 0:00 /lib/inet/netcfgd
root 4868 3949 0 11:07:48 ? 0:00 /usr/lib/pfexecd
root 4897 3949 0 11:07:51 ? 0:00 /usr/lib/utmpd
netadm 4980 3949 0 11:07:54 ? 0:01 /lib/inet/nwamd
Існують два завдання зі спеціально розрізненими ідентифікаторами процесу: swapper або sched має ідентифікатор процесу 0 і відповідає за пейджингові повідомлення, як jlliagre, наведені в прикладах раніше, і насправді є частиною ядра, а не звичайним процесом у режимі користувача.
Ідентифікатор 1 процесу, як правило, є процесом init, головним чином відповідальним за запуск і вимкнення системи. Спочатку ідентифікатор 1 процесу не був спеціально зарезервований для init будь-якими технічними заходами: він просто мав цей ідентифікатор як природний наслідок того, що це перший процес, на який викликається ядро. Більш пізні системи Unix, як правило, містять додаткові компоненти ядра, видимі як "процеси", і в цьому випадку PID 1 активно зарезервований для процесу init для підтримки узгодженості зі старими системами.
Взагалі 0 часто використовується для позначення "нульової посилання". Це означало, що незважаючи на те, що значення 0 існує, ви можете не використовувати його, оскільки ви хочете, щоб нуль означало спеціальне значення.
pid
0 має особливе значення дляkill(2)
системного виклику там, де він означає себе іwaitpid(2)
де він означає принаймні будь-який процес у моїй групі процесів . Не кажучи вже про те, щоfork()
повернення0
означає, що ми в дитині.