%3F.png)
Предположим, что ping
команда выполняется, и я набираю что-то на терминале, пока ping
она выполняется.
Теперь, когда ping
завершается и bash
возвращается управление, bash
на терминале будет выводиться то, что я набрал во время ping
работы. Это скриншот, который показывает, что я имею в виду:
Откуда bash
эта информация? Я уверен, что она не от stdin
, потому что когда я печатал "I typed this while ping was running"
, я не нажал Enter(и поэтому stdin
пусто).
решение1
Башделалполучить входные данные со стандартного ввода (stdin), который является терминалом.
Терминал может находиться в одном из двух положенийрежимы:сыройилиприготовленный(также известный как «символьный режим» и «строчный режим», термины «сырой» и «приготовленный» в основном используются в мире Unix) (слово «приготовленный» было введено как каламбур, чтобы сделать противоположность «сырому»). В сыром режиме терминал немедленно передает ввод в приложение. В приготовленном режиме терминал считывает полную строку и предоставляет (очень примитивный) механизм редактирования строки и передает данные в приложение только тогда, когда пользователь нажимает Enter.
Терминалы запускаются в режиме cooking. Приложения, которым требуется больше контроля над вводом, например bash, переводят терминал в режим raw, ожидая, пока пользователь введет команду.
решение2
Я полагаю, что терминал буферизует каждую строку текста, полученную с клавиатуры, так что любая программа, имеющая файловый дескриптор (например, fd0), прикрепленный к файлу устройства терминала, не увидит никакого текста из строки, пока терминал его не «отправит», что происходит, когда вы нажимаете Enter.
(Как обходят это строковые редакторы оболочек — я не уверен, но они определенно получают текст до того, как вы нажмете Enter).
Кроме того, когда оболочка запускает дочерний процесс (в данном случае ping
), она переходит в wait
состояние ожидания/ожидания, пока выполняется дочерний процесс, поэтому даже если терминал не удерживал от него текст, оболочка проигнорирует его, предположив, что он предназначен для дочернего процесса.
Итак, текст, который вы видите на экране, появляется потому, чтоТерминалотображает его, но нет программы, которая бы его перехватывала и что-либо с ним делала, пока дочерний процесс не завершится — и оболочка не «проснется» — затем текст будет отправлен в редактор строк оболочки. Хотя я не думаю, что все терминалы обязательно это делают.