Символ ^D(также известный как \04или 0x4, END OF TRANSMISSION в Unicode) является значением по умолчанию для параметра eofспециального управляющего символа терминала или драйвера псевдотерминала в ядре (точнее, ttyдисциплины строки, прикрепленной к последовательному или псевдотерминалу). устройство tty ). Это c_cc[VEOF]часть termiosструктуры , передаваемой в TCSETS / TCGETS ioctlодин на вопросы терминального устройства , чтобы повлиять на поведение водителя.
Типичная команда, которая отправляет те, ioctlsявляется sttyкомандой.
Чтобы получить все параметры:
$ stty -a
скорость 38400 бод; ряды 58; колонны 191; линия = 0;
intr = ^ C; выход = ^ \; стереть = ^ ?; убить = ^ U; eof = ^ D ; eol = <undef>; eol2 = <undef>; swtch = <undef>; начало = ^ Q; стоп = ^ S; susp = ^ Z; rprnt = ^ R; werase = ^ W; lnext = ^ V; флеш = ^ O;
мин = 1; время = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echo echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Этот eofпараметр имеет значение только тогда, когда терминальное устройство находится в icanonрежиме.
В этом режиме в драйвере терминала (не в эмуляторе терминала) реализован очень простой редактор строк , в котором вы можете напечатать, Backspaceчтобы стереть символ, Ctrl-Uстереть всю строку ... Когда приложение читает с терминального устройства, оно ничего не видит, пока Вы нажимаете, Returnв какой момент read()возвращается полная строка, включая последний LFсимвол (по умолчанию драйвер терминала также переводит CRотправленные вашим терминалом значения Returnв LF).
Теперь, если вы хотите отправить то, что вы печатали до сих пор, не нажимая Enter, вы можете ввести eofсимвол. Получив этот символ от эмулятора терминала, драйвер терминала отправляет текущее содержимое строки, чтобы приложение, выполняющее readего, получало его как есть (и оно не будет содержать завершающий LFсимвол).
Теперь, если текущая строка была пустой и при условии, что приложение полностью прочитало ранее введенные строки, readбудет возвращен символ 0.
Это означает конец файла для приложения (когда вы читаете из файла, вы читаете, пока больше нечего читать). Вот почему он называется eofсимволом, потому что его отправка заставляет приложение видеть, что больше нет ввода.
Теперь современные оболочки, по их подсказке, не устанавливают терминал в icanonрежим, потому что они реализуют свой собственный линейный редактор, который намного более продвинут, чем встроенный драйвер терминала. Тем не менее, в своем собственном редакторе строк , чтобы не запутать пользователей, они дают ^Dсимволу (или какому-либо другому eofнастройку терминала ) то же значение (для обозначения eof).