Наскільки мені відомо, /dev/pts
файли створюються для сеансів ssh або telnet.
tty
.
Наскільки мені відомо, /dev/pts
файли створюються для сеансів ssh або telnet.
tty
.
Відповіді:
Нічого не зберігається в /dev/pts
. Ця файлова система живе суто в пам'яті.
Записи в /dev/pts
є псевдо-термінали (PTY для стислості). Ядра Unix мають загальне поняття терміналів . Термінал забезпечує спосіб додаткам відображати вихід і приймати вхід через термінальний пристрій . Процес може мати керуючий термінал - для програми з текстовим режимом це взаємодія з користувачем.
Термінали можуть бути або апаратними терміналами ("tty", скорочення - "телетайп"), або псевдо-терміналами ("pty"). Апаратні термінали підключаються через деякий інтерфейс, такий як послідовний порт ( ttyS0
,…) або USB ( ttyUSB0
,…) або через екран та клавіатуру ПК ( tty1
,…). Псевдотермінали забезпечуються емулятором терміналу, що є додатком. Деякі типи псевдотерміналів:
Якщо програма відкриває термінал для запису, вихід з цієї програми з'являється на терміналі. Як правило, декілька програм одночасно виводять на термінал, хоча це часом може заплутатись, оскільки немає можливості сказати, яка частина виходу прийшла з якої програми. Фонові процеси, які намагаються записати на свій керуючий термінал, можуть бути автоматично зупинені сигналом SIGTTOU .
Якщо програма відкриває термінал для читання, вхід від користувача передається цій програмі. Якщо з одного терміналу читаються кілька програм, кожен символ перенаправляється незалежно до однієї з програм; це не рекомендується. Зазвичай існує лише одна програма, яка активно читає з терміналу в даний момент часу; програми , які намагаються читати їх керуючий терміналом , поки вони не знаходяться в передньому плані будуть блокуватися сигналом SIGTTIN .
Для експерименту запустіть tty
у терміналі, щоб побачити, що таке термінальний пристрій. Скажімо це /dev/pts/42
. У оболонці в іншому терміналі запустіть echo hello >/dev/pts/42
: рядок hello
відображатиметься на іншому терміналі. Тепер запустіть cat /dev/pts/42
і введіть в інший термінал. Щоб вбити цю cat
команду (що зробить інший термінал важким у використанні), натисніть Ctrl+ C.
Переписка на інший термінал час від часу корисна для відображення сповіщення; наприклад write
команда робить це. Зчитування з іншого терміналу зазвичай не виконується.
strace
ввести програму читання даних, але це все.
tostop
прапор tty. Цей прапор не встановлений за замовчуванням. І я виправлений на прочитане з іншого TTY. Я спробував це, і він спрацьовує, але це працює на основі читання, а не на персонажів (коли сидіти за запитом оболонки, вони такі самі, як оболонки читають по 1 символу за один раз). Можливо, було б добре прояснити цей момент, тому що саме зараз я тлумачив вашу відповідь.
read
дзвінок поверне лише послідовні символи (точніше, байти), але програма не має контролю над тим, скільки байтів read
повернеться дзвінок, тож не краще.
Файли в /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 цього не робить. Псевдотис - це трохи реліквія, що залишилася за часів апаратних терміналів, підключених послідовним кабелем.
/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-термінала змагаються за читання з того самого пристрою, на який виводиться оболонка.
echo Hello > /dev/pts/1
... Подивіться, що станеться, це ваш термінал.