Терминалы не имеют идентификаторов процессов.
Конечно, это процессы, которые имеют идентификаторы процессов. Терминалы имеют свои собственные идентификаторы, и вы увидите их в выходных данных инструментов, таких как w
, who
и (в столбце TTY
) ps
. Но это не идентификаторы процессов.
Соотношение между процессами и терминалами не 1:1. Более того, как grawity
, оболочка не является терминалом. Терминал - это устройство. Оболочка - это программа. Программа bash
представляет собой оболочку, чей ввод и вывод (по крайней мере, в интерактивном режиме) считываются и записываются на оконечное устройство.
Терминалы на персональных компьютерах Linux и Unices, как правило, не являются реальными физическими устройствами, подключенными к какому-либо последовательному порту. Скорее, это либо виртуальные терминалы, либо псевдо терминалы. Оба являются продуктами программ эмулятора терминала .
- В случае виртуальных терминалов эта программа встроена в ядро операционной системы (хотя уже были предприняты шаги, чтобы изменить это), и у нее нет идентификатора процесса, потому что это не отдельный процесс сам по себе.
- В случае псевдотерминалов есть процесс, который управляет "ведущей" стороной устройства и отображает содержимое терминала некоторым образом. Обычно это программа с графическим интерфейсом, такая как
xterm
, lxterminal
, konsole
, gnome-terminal
или rxvt
. (В качестве альтернативы это могут быть демоны SSH или TELNET.) У них есть идентификаторы процессов. Но процесс - это эмулятор терминала, а не псевдотерминальное устройство.
Что касается того, почему вы видите два процесса bash
: у вас запущены два процесса bash
. Это так просто. Они не обязательно связаны с одним и тем же терминальным устройством или даже с любым терминальным устройством. Опять же, столбец TTY
в выводе ps
скажет вам, какой управляющий терминал есть у каждого процесса. (Терминалы не имеют идентификаторов процессов, но в некотором смысле процессы имеют идентификаторы терминалов.)