В чем разница в использовании Ctrl + D и Ctrl + C для завершения команды cat?

В однопользовательских системах Linux su обычно используется для получения root-прав, но в нем есть много других функций. многопользовательская среда.

Если я с кем-то еще и мне нужно временно переключиться с его учетной записи на свою, не запуская новую оболочку, я могу использовать su , чтобы стать мной, выполнить нужные команды и выйти из системы. . Для этого мне нужны мои учетные данные. Помните, это восходит к тому времени, когда вы были на терминале со скоростью 300 бит / с, и добраться до другого терминала можно было в другой комнате.

Как root, вы можете su кому угодно, не зная его пароля. Это хорошо для отслеживания проблем с учетной записью пользователя.

sudo в основном вытеснил то, что делает su , и делает это намного лучше, поскольку вы можете указать, какого пользователя и какие команды можно запускать. Однако для администратора su все еще есть место.

3
18.07.2017, 20:34
2 ответа

Когда выполняется команда cat, терминал находится в каноническом режиме ввода . Короче говоря, это означает, что линейная дисциплина терминала обрабатывает редактирование строки и реагирует на все специальные символы , настроенные для терминала (, которые можно просмотреть и установить с помощью sttyкоманда ).

Команда catпросто read()выполняет вызов из своего стандартного ввода до тех пор, пока вызов read()не вернет нулевые прочитанные байты, соглашение POSIX для достижения конца файла.

Терминалы на самом деле не имеют "конца". Но есть такое обстоятельство, что read()терминального устройства возвращает нулевые байты. Когда линейная дисциплина получает специальный символ «EOF», что бы он ни был настроен в то время, он заставляет read()вернуться с тем, что находится в буфере редактирования в этот момент. Если буфер редактирования был пуст, это возвращает нулевые байты, прочитанные из read(), что приводит к выходу из cat.

catтакже завершает работу в ответ на сигналы, действия которых по умолчанию заключаются в завершении процесса. Линейная дисциплина также генерирует сигналы в ответ на специальные символы. Специальные символы «INTR» и «QUIT» вызывают отправку сигналов INTи QUITпроцессу переднего плана (группе ), которая будет/содержит процесс cat. По умолчанию эти сигналы завершают процесс cat.

Что приводит к наблюдаемым различиям:

  • Ctrl + D имеет это действие, только если это специальный символ EOT. Это обычно случай, но это не обязательно случай. Точно так же Ctrl + C действует только тогда, когда это специальный символ INTR.
  • Ctrl + D не приведет к завершению cat, если в данный момент строка фактически не пуста. Однако прерывание, сгенерированное Ctrl + C , будет.
  • Наивная реализация catна языке C блокирует стандартный вывод буфера, если обнаруживает, что он направлен на файл, как в вопросе. Теоретически это может привести к потере буферизованных и еще не выведенных строк, если catзавершается с помощью SIGINT.

    На практике библиотеки C BSD и GNU реализуют режим буферизации, который не описан в стандартах языка C или C++. Стандартный вывод при перенаправлении в файл или канал — это интеллектуальная буферизация . Это блочная буферизация; за исключением того, что всякий раз, когда библиотека C обнаруживает, что приближается read()к началу новой строки из любого файлового дескриптора, открытого для терминального устройства, она сбрасывает стандартный вывод. (Библиотеки C BSD и GNU не совсем реализуют одинаковую семантику и, строго говоря, делают больше, чем это, но такое поведение является общим подмножеством. )Таким образом, сигнал прерывания не приведет к потере буферизованного вывода, когда catпостроен поверх такой библиотеки C.

  • Конечно, если catявляется частью командного конвейера, некоторые другие процессы могут буферизовать данные после catдо того, как эти данные попадут в выходной файл. Итак, еще раз, когда линейная дисциплина отправляет SIGINT, что (по умолчанию )завершает все процессы в конвейере, входные данные, буферизованные и еще не записанные, будут потеряны; тогда как обычное завершение catспециальным символом "EOF" приведет к нормальному завершению конвейера, при этом все данные будут переданы нижестоящему процессу до того, как он получит индикацию EOF от его read(). ] его стандартного ввода.

Обратите внимание, что это имеет очень мало отношения к тому, что происходит, когда ваша интерактивная оболочка считывает от вас строку ввода. Когда ваша оболочка ожидает ввода, терминал находится в не-каноническом режиме ввода , в котором линейная дисциплина не выполняет никакой специальной обработки специальных символов.То, как ваша оболочка обрабатывает Ctrl + D и Ctrl + C , полностью зависит от библиотеки редактирования ввода, которую использует ваша оболочка (. libedit, readline или ZLE )и как эта библиотека редактирования была настроена (с привязками клавиш и т.п. ).

Дополнительная литература

5
27.01.2020, 21:12

CTRL + C — сигнал прерывания. Это остановит команду.

CTRL + D конец файла или exit(). Когда вы ввели CTRL + D , он вышел из команды из-за конца файла. Если вы наберете CTRL + C в своей оболочке, ничего не произойдет. Однако, если вы введете CTRl + D , в большинстве систем произойдет выход из вашей текущей оболочки.

4
27.01.2020, 21:12

Теги

Похожие вопросы