LINUX.ORG.RU

Terminal, shell и tty (ptty) в Linux

 , , , ,


1

1

Здравствуйте, правда очень стыдно спрашивать такие вещи. Дело в том, что уже намного сложнее вещи изучил в архитектуре и работе самой ОС. А вот тут стал чувствовать, что есть провал в понимании и знаниях. Решил спросить, чтобы окончательно разобраться. Проблема вот в чем. Раньше вроде пользовался терминалом и все нормально. А теперь начал углубленно разбирать строение и архитектуру linux подобных систем и возникло непонимание происходящего. Читал кучу статей, но к сожалению не нашел того что надо. 1. Терминал, консоль (shell). Насколько я понимаю это единственный способ сделать системный вызов. То есть только с помощью него происходит взаимодействие с ядром операционной системы ? Чем данный исполняемый файл отличается от других, что может иметь доступ к системным вызовам. Знаю что у каждого пользователя прописан свой интерпретаторв passwd.Можно ли было без терминала обойтись ? 2. Что такое tty. Читал про последовательные порты, историю, один компьютер и много пользователей. Что общего между tty & shell(terminal). Зачем сделана возможность при нажатии на Ctrl+Alt+FX получать доступ к этому устройству. И какую роль он вообще играет в системе. 3. Как устроено все это в встроенных линуксоподобных системах как Android. На вики написано, что там обычно нету The Linux console is an optional kernel feature, and most embedded Linux systems do not enable it.

То есть у меня тотальное непонимание взаимодействия терминала, псевдотерминала с ядром и в общем в системе. Пожалуйста, не пишите фразы типа : «Что ты тут вообще делаешь, иди учи матчасть, как можно работать в линукс не зная такого.....». И сам знаю. Объясните пожалуйста, что и зачем надо, просто хочу разобраться в этом. Или дайте что источники где это описано для таких как я. Спасибо всем заранее.


Насколько я понимаю это единственный способ сделать системный вызов.

Вот сначала разберись с этим бредом, а потом спрашивай свои вопросы.

Gotf ★★★
()
Ответ на: комментарий от Gotf

Дайте пожалуйста хороший материал для прочтения

CROSP
() автор топика

Терминал, консоль (shell). Насколько я понимаю это единственный способ сделать системный вызов

Нет. Читай что такое API.

pedobear
()

Ты про какие сисвызовы? Которые open/read/write и т.п.? Или которые через ioctl?

А вообще, для начала почитай, что происходит при загрузке операционки. Твой процесс init запускает всякие разные сервисы (в т.ч. и agetty на терминалах 1-6, иксы на терминале 7 и т.п.). Потом почитай, что такое shell.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ananas

Спасибо, за ответы. Дело в том, что понимаю и что такое АПИ и что такое init.Как происходит загрузка, разные стадии, runlevelы (если брать init, а не systemd). Просто каша в голове с терминалом, tty ,pty,getty.То есть самой абстракцией терминала. Подскажите пожалуйста хороший материал по этим темам(можно на английском). Искал,везде написано все очень кратко и в общих чертах.

CROSP
() автор топика
Ответ на: комментарий от CROSP

http://www.tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc7
http://lwn.net/images/pdf/LDD3/ch18.pdf
[это все есть на русском]

Терминал это терминал - оконечное пользовательское устройство (грубо говоря монитор с клавиатурой). Просто не все что ты видишь на экране выводится на терминал. Иксы, например, рисуют окошки не в терминале... ранние сообщения ядра (буковки что бегут во время загрузки по экрану) выводятся напрямую на видеокарту.. ls >file - запускается в терминале, но ls уже не о каких терминалах не знает.

naszar
()

1. Терминал, консоль (shell). Насколько я понимаю это единственный способ сделать системный вызов.

Дело в том, что уже намного сложнее вещи изучил в архитектуре и работе самой ОС

нихрена вобще ты про ос не изучил, совсем

anonymous
()
Ответ на: комментарий от CROSP

терминал, любой - это устройство ввода/вывода. нафига они нужны, подобные устройства, какие бывают, и как используются - нагуглить можно без особого труда

ananas ★★★★★
()
Ответ на: комментарий от ananas

Спасибо, всем за ссылки. Почитал, но все равно как-то расплывчато все. На в 2 уровне загрузки загружаем ядро в память, в свою очередь ядро подгружает рамдиск в память, который содрежит минимальную файловую систему с набором различных драйверов требуемых для запуска системы. После всех этих шагов, очищаем от рамдиска память и монтируем обычную ФС. Запускаем главный процесс системы - init. Он в свою очередь читает файлик inittab, а там обычно прописано что-то типо mingetty ttyX. Gettу выступает как барьер для пропуска пользователя в систему.Насколько я понял на данном этапе tty выступает как чат между пользователем и mingetty или как bridge.к Хорошо, пользователь зашел. После этого запускается программа прописанная в passwd, то бишь shell. Если я правильно понял shell делает, то что из имени понятно - интерпретирует команды вводимые пользователем. То есть написал ls, программа shell полезла искать такой исполняемый файл в прописанных путях (PATH). Если программа найдена происходит fork (но с возвращением в родителя - &) Программа получает те же сегменты что и родитель ... (кроме стека) выполняется и возвращает управления родителю. Который опять просит ввести что-то. У каждого процесса есть три стандартных потока ввода/вывода. Stdin,stderr,stdout. Так как в линуксе все файл, они тоже представлены как файлы (proc/.../), то есть у каждого процесса есть минимум 3 открытых файловых дескриптора( легко проверить proc/../fd). Насколько я понял если к процессу привязан терминал, то это значит что поток ввода и вывода процесса привязан к этому псевдоустройству.То есть таким образом tty нужен только для общения с программой ? Прочитал что обычно Х-ы привязаны к tty8. Зачем он надо для Х если пользователь взаимодействует через GUI ? Проверил с помощью ps -ef , у меня Х на одном дистрибутиве весят на tty7 на другом на tty8 , просто зависит от прописанного в inittab. А что я увидел при в списке процессов еще, то что всего лишь несколько процессов привязаны к терминалам, это mingetty которые насколько я понял работают в фоне и ждут пока пользователь новый зайдет по какому-то порту СОМ или текущий нажмет Ctrl-Alt-FX и введет логин и пароль и попадает в shell. Ну еще один процесс это если терминально-ориентированная программа(прочитал что так правильно называть гуи окно терминала) открыта, то тоже привязана к какому-то устройству pts(логично).Ну и все порожденные процессы тоже привязаны. Единичные процессы используют терминал. Какие тогда еще преимущества есть в привязке к терминалу ? Ну насколько я понял, если я вообще что-то понял, то это привязка стандартных потоков ввода и вывода к терминалу, то есть на этом основана работа pipe . Подскажите пожалуйста я хоть что-то верно написал или опять бред полнейший ?

CROSP
() автор топика
Ответ на: комментарий от CROSP

Рамдиск — необязательная опция.

sysvinit есть не у всех, кое-где openrc, где-то еще что-то, а у некоторых больных на голову вообще systemd.

Логин, кстати, необязательно через ввод пароля идет, там еще много фич у pam.d (например, через скан пальца, фото морды лица, показания алкотестера или еще как).

У процессов может не быть ни одного открытого fd, если он демонизирован вручную и нет надобности коннектить stdin на /dev/zero, а stderr и stdout на /dev/null. Демон спокойно "отрывается" от терминала: для этого переназначаем или просто закрываем вышеназванные дескрипторы и игнорируем SIGHUP.

Если иксы не запускать на каком-либо tty, то как на них переключиться после переключения в консоль? Это только на каком-нибудь нелинуксе возможно, вроде ондроеда.

Изначально к терминалам не привязаны лишь дети init и он сам. Далее все, что ты запускаешь, сидит на каком-нибудь терминале или псевдотерминале (если запускаешь из-под иксов). Но, как уже говорилось выше, можно и оторвать.

Аналогично про stdin и stdout: при помощи труб их можно "переподключить" к чему угодно!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Почему тогда у практически всех процессов нету привязанных tty, только у единиц ? Смотрите сами иксы работают то изначально из терминала, но все процессы запущенные гуйовым способом не привязаны ни как кому терминальному устройству. Если же, к примеру , запустить что-то из командного интерпретатора, то получаем вывод на терминал к которому привязан шел. То выходит что практически все программы запускаются без терминала.

CROSP
() автор топика
Ответ на: комментарий от CROSP

все процессы запущенные гуйовым способом не привязаны ни как кому терминальному устройству

Потому что иксы отрывают их от терминала. А если из консольки запустишь, увидишь и stdout, и stderr гуевых программ.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Я ж про это и говорю, то есть по сути с переходом на гуевые программы надобность в терминальных устройствах для программ отпала как таковая. То есть по сути все эти терминалы и псевдо терминалы нужны для того чтобы общаться с программой через стандартные потоки ввода и вывода ? При гуи просто клацаем кнопки. Такой вопрос тогда, а как нам посмотреть что происходит терминале привязанном к иксам ?

CROSP
() автор топика
Ответ на: комментарий от CROSP

Я ж про это и говорю, то есть по сути с переходом на гуевые программы надобность в терминальных устройствах для программ отпала как таковая.

Неправильно. Просто многая гуйня рассчитана на тупую обезьяну. Но все-таки, в stderr приличный софт ошибками плюется. Поэтому если что-то глючит, запускаешь из терминала и смотришь, в чем беда. Если что — описываешь баг.

При гуи просто клацаем кнопки.

И совершенно не видим stdout и stderr, что очень плохо.

как нам посмотреть что происходит терминале привязанном к иксам?

Ошибки идут в /var/log/Xorg.N.log, потому как init, если он стартует иксы или xdm, отрубает иксы от терминала.

Ну и можно напрямую из runlevel==3 запустить иксы командой startx, да смотреть вволю.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Спасибо большое , за объяснение. Скажите, то есть насколько я понял, в общем tty нужны для ввода и вывода информации. То есть через tty делаются вызовы ioctl. Соответственно иксам нужно тоже как-то передавать информацию ядру о вводе и выводе. То есть по сути , tty это единственный способ ввода вывода информации. То есть как раньше, были только мониторы и клавиатуры. Правильно ли я понял ?

CROSP
() автор топика
Ответ на: комментарий от CROSP

tty — это просто терминал. Псевдоустройство. Некоторые ioctl'ы в нем действительно делаются (скажем, отключение эха при вводе пароля), но он необязателен для общения юзера с софтом.

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.