Да, хотя это еще не все. ttys000
- это также символьное устройство, находящееся в /dev
, пользователь, имеющий права на запись в группу tty
(большинство пользователей имеют), может передавать символы в это устройство, и они появятся на соответствующем терминале. tty*
- это не настоящие телетайпы, это эмулированные tty
, эмулированные вашим (соответствующим образом названным) эмулятором терминала.
У меня нет Mac, поэтому я буду использовать соглашение об именовании Linux для следующего примера:
Откройте терминал A как пользователь A и найдите эмулированный tty:
[userA@terminalA]$ tty
/dev/pts/0
Откройте терминал B как пользователь B и сделайте то же самое:
[userB@terminalB]$ tty
/dev/pts/3
Теперь перенаправьте пару символов с терминала A на терминал B:
[userA@terminalA]$ echo Hi there > /dev/pts/3
И посмотрите, как они появятся на терминале B:
[userB@terminalB]$ Hi there
На Mac устройства должны быть /dev/ttys*
, я полагаю.
Более или менее. Сам ttys000
- это просто символьное устройство, фактическая сущность, которая управляет вашим java-процессом - это эмулятор терминала. Под управляющим я подразумеваю, что он является родителем вашего java-процесса. Родитель может взаимодействовать со своими дочерними процессами проще, чем другие процессы.
Более того, если не принять определенные меры предосторожности (см. man nohup
для примера такой предосторожности), смерть родительского процесса приведет к смерти всех его дочерних процессов.
В ответе Karlson уже объяснялось, что ?
означает процесс, не связанный с терминалом.
Поскольку терминал сам по себе является лишь знаковым устройством, я полагаю, нетрудно сделать вывод, что процессу не обязательно быть связанным с терминальным устройством.
Фактические терминалы /dev/tty
почти не используются в современных *nix OS (хотя они активно используются в процессе загрузки). Но это не означает, что вы не можете использовать фактические терминалы. На машине Linux (извините, я понятия не имею, как это делается на Mac) комбинация Ctrl + Alt + F1 (и F2, F3, ... ... до F7) дает вам реальный терминал. Один из этих реальных терминалов используется для выполнения графического отображения.
Несколько процессов (включая графические приложения) в современной *nix OS связаны с терминальным устройством, потому что сценарий, запускающий их, должен передавать дополнительные аргументы. Сценарий, запускающий оболочку, передает дополнительные аргументы и запускает процесс. Такие сценарии часто становятся причиной путаницы.