Как сигнализировать об окончании ввода стандартного ввода


82
  1. В Bash я узнал, что сигнал окончания можно изменить с помощью вот документа. Но по умолчанию, как я могу сигнализировать конец ввода стандартного ввода?
  2. Я обнаружил, что с помощью cat и chardet их входные данные 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+DCtrl и заглавная 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)системного вызова.
— ulidtko
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.