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


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.