Як сигналізувати про закінчення вводу stdin


82
  1. У Bash я дізнався, що тут закінчується сигнал можна змінити документом. Але за замовчуванням як я можу сигналізувати про закінчення вводу stdin?
  2. Я випадково виявив, що з кішками та шардетами їх stdin вхід може бути сигналізований як закінчений Ctrl + d. Але я, мабуть, пам’ятаю, що Ctrl + d і Ctrl + c схожі на закінчення виконання запущеної команди. Так я помиляюся?

Відповіді:


114

Ctrl+D, коли вводиться на початку рядка на терміналі, означає кінець вводу. Це не сигнал в unix сенсі: коли програма читає з терміналу і користувач натискає Ctrl+D, програма повідомляється, що кінець файлу досягнуто (подібно до того, як він читав з файлу і передав останній байт).

Ctrl+Cпередає сигнал, SIGINT . За замовчуванням SIGINT (сигнал переривання) вбиває програму переднього плану, але програма може вловлювати сигнал і реагувати якимось іншим способом (наприклад, сама оболонка вловлює сигнал і перериває лінію, яку ви почали вводити, але це не ' t вихід, він показує нову підказку і чекає нового командного рядка).

Ви можете змінити символи, пов'язані з кінцевим файлом та SIGINT за допомогою sttyкоманди, наприклад stty eof a, зробить aсимвол кінця файлу та stty intr ^-відключить символ SIGINT. Це рідко корисно.


Дякую! Чи Ctrl+Dозначає Ctrl та капітал D чи це не має значення?
Тім

5
@Tim: це нижчий регістр, який ви хочете ... Змова про написання команд клавіатури з великими літерами приходить, тому що мітки на клавіатурі завжди є великими літерами, і те, що описується, - КЛЮЧЕ ПОСЛІДНЯ, а не власне код символів, який бачить програма. Так, це іноді бентежить.
Калеб

@Caleb: Дякую! Як слід вказати, що ключ є капіталом? Або колись є такий випадок?
Тім

@Tim На терміналі комбінації клавіш Ctrl+Shift+Dі Ctrl+Dвсе одно надішліть той самий символ (символ 4, як правило, називається Ctrl+D).
Жиль

2
@Tim Термінал отримав Ctrl + D. Він не надсилає символу програмі. Що трапляється так, що коли програма читає з терміналу, термінал каже йому "це кінець файлу", як і коли програма намагається прочитати після закінчення файлу диска. Оболонка взагалі не бере участь.
Жиль

23

Ваша друга точка з’єднує дві абсолютно різні речі разом.

  • Ctrl + C надсилає сигнал запуску в запущений процес.
  • Ctrl + D надсилає символ кінця передачі .

Ви шукаєте останнє.


7
Потенціал для плутанини тут: з точки зору програми, жоден фактичний символ не надсилається для ^ D. Що означає, що додаток не отримує цього символу від read(2)syscall.
ulidtko
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.