Когда Вы работаете ./s
, Вы говорите ядру выполнять программу s
. Если у Вас есть разрешение выполнения, то ядро читает первые несколько байтов файла, видит #!
строка, таким образом, это знает, что это - сценарий, и выполняет интерпретатор, передавая его название сценария как его первый аргумент. Если Вы не имеете, выполняют разрешение, ядро прерывает выполнение в первом шаге.
Когда Вы работаете zsh s
, Вы выполняетесь zsh
, и скажите этому читать названный файл s
и интерпретируйте его как команды. Вы не выполняетесь s
, Вы выполняетесь zsh
. То же самое с sh s
или cat s
.
Когда Вы работаете source s
, снова, Вы говорите zsh читать файл, поэтому что имеет значение, то, что Вы прочитали разрешение на нем.
Процессы должны иметь родителя (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]
...
на Солярисе:
$ 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
процессу традиционно дают pid #1
, это больше не случай, когда виртуализация уровня ОС используется как зоны Соляриса, поскольку может быть больше чем один 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
Существует две задачи со специально выдающимися идентификаторами процесса: программа подкачки или sched имеют идентификатор 0 процесса и ответственны за подкачку страниц, как jlliagre, вставленный в примеры прежде, и являются на самом деле частью ядра, а не нормального процесса непривилегированного режима.
Идентификатор 1 процесса обычно является процессом init, прежде всего, ответственным за то, что начал и закрыл систему. Первоначально, идентификатор 1 процесса не был конкретно зарезервирован для init никакими техническими мерами: это просто имело этот идентификатор как естественное следствие того, чтобы быть первым процессом, вызванным ядром. Более свежие системы Unix обычно имеют дополнительные компоненты ядра, видимые как 'процессы', в этом случае PID 1 активно резервируется, чтобы процесс init поддержал непротиворечивость с более старыми системами.
В целом, 0 часто используется для выражения 'нулевой ссылки'. Это означало, что даже при том, что эти 0 значений существуют, Вы не могли бы использовать их, потому что Вы хотите, чтобы нуль показал специальное значение.