Символ ^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
).