Что такое EOF в Ubuntu, а также о Кернигане и Ритчи

Я начал изучать C, а также начал использовать Ubuntu. Пишу коды в vim через терминал. Я учился у Кернигана и Ричи. Вот код -

#include <stdio.h>

int main()
{
 int c;
 while ( (c = getchar()) != EOF)
 putchar(c);
 return 0;
 }

Теперь мой вопрос: -

  1. Программа останавливается, если я нажимаю ctrl+z , но она также завершается, если я нажимаю ctrl+D , когда я читаю об этом в Интернете, он говорит, что ctrl+z - это EOF в Windows и ctrl+d в Linux. Означает ли это, что они оба являются EOF в Linux? Если да, то каковы другие EOF?
  2. Можно ли задавать такие сложные вопросы в первой главе этой книги? или я должен просто прочитать это, и такие мысли прояснятся, когда я буду читать дальше?

person Ravi Yadav    schedule 19.11.2013    source источник
comment
Фактически, в Ubuntu, использующей оболочку bash, ввод ^Z запускает команда приостановки работы оболочки, которая просто переводит работающую программу в фоновый режим. Тем не менее, он все еще работает. Так что ^Z действительно не имеет ничего общего с EOF в Ubuntu. Вы можете увидеть это, если вы добавите, например. вызов printf() после цикла в вашей программе.   -  person unwind    schedule 19.11.2013
comment
@unwind Теперь я понимаю. Спасибо .   -  person Ravi Yadav    schedule 19.11.2013


Ответы (3)


Происходят две разные вещи.

Нажатие Control-Z в Windows или Control-D в Linux вызывает состояние конца файла и приводит к тому, что getchar() возвращает значение EOF.

Нажатие Control-Z в Linux делает нечто иное: оно приостанавливает выполнение вашей программы. После нажатия Control-Z, если вы наберете команду jobs, она покажет вашу приостановленную программу. Ввод fg заставит его возобновить и продолжить прием ввода - до тех пор, пока вы не просигнализируете о конце файла, набрав Control-D. Было бы легче увидеть, сгенерировала ли ваша программа некоторый вывод.

Поведение Control-Z не связано с тем, как написана ваша программа; Control-Z приостановит (почти) любую запущенную программу, независимо от того, написана она на языке C или нет, и независимо от того, ожидает она ввода или нет. Такое поведение характерно для Linux и других Unix-подобных операционных систем.

Вероятно, у вас никогда не закончатся сомнения и вопросы; Я, конечно, нет.

person Keith Thompson    schedule 19.11.2013
comment
@Keith: Спасибо за ваше время и ответ. Сэр, ваш ответ действительно очень помог. Это означает, что в Linux есть только один EOF, и это ctrl + d. Ваш ответ также резюмирует, почему я был возвращен в саму программу, а не в исходный код, когда я использовал фг с помощью Ctrl+Z. Большое спасибо за подсказку по английскому. - person Ravi Yadav; 19.11.2013
comment
@ Ravi.y: Это более косвенно. Control-D не EOF. Нажатие Control-D, когда программа ожидает ввода, вызывает условие конца файла, в результате чего функция getchar() возвращает специальное значение EOF (которое обычно равно -1). Ошибка ввода-вывода также приводит к тому, что getchar() возвращает EOF; вы можете отличить конец файла от ошибки (после gethchar() возврата EOF) с помощью функций feof() и ferror(). Да, Control-D — единственный ввод в Linux, который вызывает состояние конца файла. (Вы можете использовать stty для перенастройки, но не делайте этого.) - person Keith Thompson; 19.11.2013
comment
@Ravi.y: Пожалуйста. Я добавил ссылку, касающуюся использования сомнений, в конец моего ответа. - person Keith Thompson; 19.11.2013
comment
Я прошел по этой ссылке, но так и не смог решить, является ли использование неверным. Мое личное мнение состоит в том, что мы изучаем английский язык, чтобы общаться с людьми по всему миру. Теперь, если наше использование создает двусмысленность, нам было бы уместно исправить это. Здесь, в Индии, слово «сомнение» используется для обозначения неуверенности/вопроса и широко (99,9%) используется. Всегда хорошо, когда такие люди, как ты, указывают на такие вещи. Я отредактировал этот вопрос и буду помнить разницу между сомнением и вопросом. Еще раз спасибо, сэр. - person Ravi Yadav; 20.11.2013
comment
@ Ravi.y: я удалил последний абзац своего ответа и добавил его в качестве комментария, поскольку он не имеет прямого отношения к тому, о чем вы спрашиваете. - person Keith Thompson; 20.11.2013

  1. CTRL+Z в Windows и CTRL+D в Linux отправляет значение EOF на стандартный ввод, сам EOF определяется реализацией. В линуксе работает только CTRL+D. Вы можете напечатать его как printf("%d", EOF);, чтобы увидеть его числовое значение.

  2. Да, сомнения и размышления всегда полезны =)

person JIghtuse    schedule 19.11.2013
comment
@Jlghtuse: спасибо за ваш ответ и время, не могли бы вы сказать мне, что тогда делает ctrl + z? это не eof в linux? потому что программа все еще останавливалась, когда я ее использовал. разве это не то, что должен делать EOF? - person Ravi Yadav; 19.11.2013
comment
CTRL-Z приводит к приостановке процесса в Linux. Это в основном приостанавливает вашу программу и отправляет вас обратно в командную строку. Но программа не завершена. Если вы наберете fg в приглашении, он возобновится, не увидев EOF. - person AShelly; 19.11.2013
comment
@Ravi.y, Ctrl+Z — это просто комбинация клавиш. В Windows он отправляет программе EOF, в Linux он останавливает процесс, как говорит ЭШелли. Комбинация клавиш для отправки EOF в Linux — Ctrl+D. - person JIghtuse; 19.11.2013

EOF в C — это условие («Конец файла»), а не специальный символ, говорящий вам, что вы достигли конца — ввода больше нет. Это условие указывается вам различными функциями, такими как getchar(), возвращающими специальное значение EOF EOF — это просто значение (часто макрос, который определяется как -1), который иначе не может встречаться в данных, которые вы читаете этими функциями.

Если вы читаете из файла или канала, вы знаете, что достигли конца этого файла, когда getchar() возвращает EOF. getchar() читает со стандартного ввода. Вы можете подключить канал к стандартному вводу вместо вашей консоли, запустив свою программу как echo hello | ./theprogram

Если вы читаете ввод с терминала/консоли, все становится сложнее. В некоторых системах существуют огромные уровни, задействованные в переносе ввода с клавиатуры в вашу программу.

Но короткая версия заключается в том, что в некоторых системах, когда вы нажимаете комбинацию клавиш CTRL+D (или CTRL+Z в других), она может уведомить вашу программу о достижении конца ввода, что заставляет getchar() возвращать EOF.

Что касается CTRL+z в Linux, это приостановит (остановит, но не завершит) текущий процесс переднего плана.

person nos    schedule 19.11.2013