Що зберігається у файлах / dev / pts і чи можемо ми їх відкрити?


73

Наскільки мені відомо, /dev/ptsфайли створюються для сеансів ssh або telnet.


6
echo Hello > /dev/pts/1... Подивіться, що станеться, це ваш термінал.
Sepahrad Salour


1
@SepahradSalour треба адаптувати номер pts до свого контексту. мій sshd використовував / dev / pts / 30 для мого сеансу.
Габ 是 好人

2
@Gab 是 好人 Щоб отримати місцезнаходження вашого поточного терміналу, ви можете скористатися командою tty.
JeromeJ

Відповіді:


110

Нічого не зберігається в /dev/pts. Ця файлова система живе суто в пам'яті.

Записи в /dev/ptsє псевдо-термінали (PTY для стислості). Ядра Unix мають загальне поняття терміналів . Термінал забезпечує спосіб додаткам відображати вихід і приймати вхід через термінальний пристрій . Процес може мати керуючий термінал - для програми з текстовим режимом це взаємодія з користувачем.

Термінали можуть бути або апаратними терміналами ("tty", скорочення - "телетайп"), або псевдо-терміналами ("pty"). Апаратні термінали підключаються через деякий інтерфейс, такий як послідовний порт ( ttyS0,…) або USB ( ttyUSB0,…) або через екран та клавіатуру ПК ( tty1,…). Псевдотермінали забезпечуються емулятором терміналу, що є додатком. Деякі типи псевдотерміналів:

  • Програми графічного інтерфейсу, такі як xterm, gnome-terminal, konsole,… перетворюють події клавіатури та миші у введення тексту та графічно відображають вихід у якийсь шрифт.
  • Програми мультиплексора, такі як екран та tmux, ретранслюють вхід та вихід з іншого терміналу та для від'єднання програм текстового режиму від фактичного терміналу.
  • Віддалені програми оболонки, такі як sshd, telnetd, rlogind,… ретрансляція вводу та виводу між віддаленим терміналом на клієнті та pty на сервері.

Якщо програма відкриває термінал для запису, вихід з цієї програми з'являється на терміналі. Як правило, декілька програм одночасно виводять на термінал, хоча це часом може заплутатись, оскільки немає можливості сказати, яка частина виходу прийшла з якої програми. Фонові процеси, які намагаються записати на свій керуючий термінал, можуть бути автоматично зупинені сигналом SIGTTOU .

Якщо програма відкриває термінал для читання, вхід від користувача передається цій програмі. Якщо з одного терміналу читаються кілька програм, кожен символ перенаправляється незалежно до однієї з програм; це не рекомендується. Зазвичай існує лише одна програма, яка активно читає з терміналу в даний момент часу; програми , які намагаються читати їх керуючий терміналом , поки вони не знаходяться в передньому плані будуть блокуватися сигналом SIGTTIN .

Для експерименту запустіть ttyу терміналі, щоб побачити, що таке термінальний пристрій. Скажімо це /dev/pts/42. У оболонці в іншому терміналі запустіть echo hello >/dev/pts/42: рядок helloвідображатиметься на іншому терміналі. Тепер запустіть cat /dev/pts/42і введіть в інший термінал. Щоб вбити цю catкоманду (що зробить інший термінал важким у використанні), натисніть Ctrl+ C.

Переписка на інший термінал час від часу корисна для відображення сповіщення; наприклад writeкоманда робить це. Зчитування з іншого терміналу зазвичай не виконується.


Або я не розумію, що ви намагаєтесь сказати, або ваша інформація вимкнена. Обгрунтоване записування процесів у термінал не призведе до SIGTTIN. Також не можна одночасно зчитувати з терміналу кілька програм (ваше твердження, що "кожен символ маршрутизується незалежно"). Лише одна програма може прочитати з терміналу в будь-який час, і спроба фонової програми прочитати з цього терміналу призведе до SIGTTIN. Це єдиний випадок, коли SIGTTIN надсилається автоматично.
Патрік

Також ви не можете читати з іншого терміналу. Це зробить значну вразливість безпеки, оскільки ви зможете перехоплювати дані. Можна straceввести програму читання даних, але це все.
Патрік

4
@Patrick Фон обробляє записи на термінал, отримуючи SIGTTOU, це був друкарський помилок. Кілька програм можуть читати з терміналу одночасно (спробуйте і подивіться, як я описую в наступному параграфі; ви повинні це зробити з процесу, контрольний термінал якого не є цим терміналом). Так, ви можете читати з іншого терміналу, якщо він належить вам - чому ви вважаєте, що це було б неможливо?
Жиль

Фоновий процес запису на термінал отримує SIGTTOU лише якщо встановлено tostopпрапор tty. Цей прапор не встановлений за замовчуванням. І я виправлений на прочитане з іншого TTY. Я спробував це, і він спрацьовує, але це працює на основі читання, а не на персонажів (коли сидіти за запитом оболонки, вони такі самі, як оболонки читають по 1 символу за один раз). Можливо, було б добре прояснити цей момент, тому що саме зараз я тлумачив вашу відповідь.
Патрік

2
@Patrick Звичайно, readдзвінок поверне лише послідовні символи (точніше, байти), але програма не має контролю над тим, скільки байтів readповернеться дзвінок, тож не краще.
Жиль

18

Файли в /dev/pts"pseudo-ttys". Вони наче названі труби певною мірою, але вони також імітують старі термінали послідовного з'єднання, як VT-100. Псевдотис виконує роботу з передачі байтів з клавіатури в програму і з програми на пристрій виведення, що звучить просто. Але це відповідає на ваше запитання щодо ясності: ядро ​​нічого не зберігає, /dev/pts/0наприклад. Заходять лише потоки байтів з stdout програми, підключеної до псевдо-tty, і програми, stdin яких підключений до тієї ж псевдо-tty, читають ці байти.

Псевдотис також вкладає шар непрямості в ці потоки байтів. Ядро може перевіряти байти на предмет спеціальних значень, таких як "Control-C" або "Control-D" або "Control-U" (які все можна настроювати, див. man stty) І надсилати SIGINT, встановлювати кінець файлу на stdin або стирати рядок на вході. Десь там є також функція буферизації, тож мої "магазини нічого" дещо неправильні, але лише на кілька кілобайт.

Ядро може перевіряти значення байтів на виході і виконувати такі дії, як перетворити нову лінію (ASCII linefeed, LF або "\n") у два байти, повернення каретки та передачу ліній (CRLF або "\r\n"), або будь-які байти, необхідні для апаратного забезпечення послідовного терміналу. Опосередкованість псевдо-тти дозволяє незалежність від апаратних засобів.

Псевдо-Ttys також дозволяє всі "встановити швидкість передачі", "встановити паритет" і так далі ioctl()системні дзвінки, і, ймовірно, нічого не роблять з ними. Це дозволяє програмам, записаним ще в день VT-100, ADM-3 і Whate Watevers, продовжувати працювати без помилок. Програмне забезпечення, драйвер пристрою псевдо-ttys, діє як апаратне забезпечення.

Псевдо-ttys можуть використовуватися sshdі telnet, але вони також використовуються між термінальним емулятором (наприклад, xtermабо rxvt) і оболонкою, яка зазвичай працює всередині xterm.

Linux і багато Unixes мають псевдо-ttys. План 9 цього не робить. Псевдотис - це трохи реліквія, що залишилася за часів апаратних терміналів, підключених послідовним кабелем.


13

/dev/це спеціальний каталог файлів пристроїв. Це абстракції, це не реальні файли на диску. Каталог заповнюється при завантаженні і можуть бути змінені , щоб відобразити існуючі інтерфейси пристроїв, які створюються і знищуються в ядрі і просторі користувача демона udevd.

Багато представлених таким чином пристроїв є віртуальними. Сюди входять записи в /dev/ptsконсольних пристроях. Ось чому один створений для віддалених сеансів; вони також створюються, коли ви відкриваєте локальний термінал GUI.

Ви можете відкрити їх як файли, хоча це не має великого значення. Щоб отримати /dev/ptsвузол, до якого підключена оболонка, використовуйте tty:

> tty
/dev/pts/4

Тепер перейдіть на іншу консоль і спробуйте:

> echo "duck!" > /dev/pts/4

Розумний. Тепер спробуйте:

> cat /dev/pts/4

Потім спробуйте скористатися оболонкою в / dev / pts / 4. Ви застрягли, поки не вийдете з catіншої сторони, але більшість того, що ви наберете на pts / 4, пройде через (наприклад, спробую "привіт світ", з яким я потрапив hlна pts / 4 та ello wordна catконсолі).

Я здогадуюсь тут, що пристрій приймає вхід з оболонки та виводить її через систему, і ось так речі закінчуються на екрані - оболонка не має справу з обладнанням, система є. Спробуйте strace bash(і подивіться, man straceякщо ви не знаєте, що це таке); Ви отримуєте попередній шквал дзвінків, коли починається удар. Тепер почніть натискання клавіш:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Для кожного введеного письма є читання зі стандартного введення та запис у стандартне. Але з чим пов'язаний стандарт оболонки? Тепер спробуйте straceсвій термінал GUI - вам доведеться з’ясувати ім’я, якщо ви цього не знаєте, наприклад, у KDE це konsole, і GNOME gnome-terminal, я вважаю. Вихід з цього strace, ймовірно, більш виразний - у моєї є багато poll()і recvfrom(). Я не бачу жодного запису, але якщо тепер витягнути catтрюк з іншого терміналу, ви помітите, коли ви набираєте, ключові штрихи, які читаються кішкою, взагалі не реагують на висновок страйку - термінал не ' t їх отримання. Тож додаток та термінал GUI-термінала змагаються за читання з того самого пристрою, на який виводиться оболонка.


в чому полягає користь 'cat / dev / pts / 4', коли ми застрягли та чому ми зациклюємось під час виконання цієї команди.
користувач2720323

Я додав кілька абзаців, щоб спробувати пояснити це.
goldilocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.