^DСимвол (також відомий як \04або 0x4, Кінець передачі в 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; наступний = ^ V; змивання = ^ О;
хв = 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 echoe 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).