2014-01-26 3 views
25

Я в тупике по вопросу 1.5.2 в K & R. Я когда-то искал Google и выяснил, что я должен предоставить вход EOF после ввода символов.Сигнал EOF в терминале mac osx

long nc = 0; 

while (getchar() != EOF) 
    ++nc; 
printf("%ld\n", nc); 

return 0; 

Я пробовал как commnad-D, так и control-D как входы EOF, но ничего не работал. Любая идея, как обеспечить EOF для mac osx?

+2

https://discussions.apple.com/message/11198745#11198745 – Dave

ответ

48

По умолчанию OS X (ранее Mac OS X) Терминалы признают EOF когда Ctrl - D нажимаются в начале строки.

В деталях, фактическая операция заключается в том, когда Ctrl - D нажата, все байты в входном буфере терминала передаются в запущенном процессе с помощью терминала. В начале строки в буфере нет байтов, поэтому говорят, что имеется нулевой байт, и это действует как индикатор EOF.

Эта процедура служит также способ доставки вклад в этот процесс до конца строки: Пользователь может ввести несколько символов и нажмите Ctrl - D, и символы будут посланы к процессу немедленно, без обычного ожидания ввода/возврата. После того, как операция «отправить все буферизованные байты немедленно» выполняется, в буфере не осталось байтов. Итак, когда Ctrl - D нажимается второй раз, это то же самое, что и начало строки (никакие байты не отправляются, а процессу даются нулевые байты), и он действует как EOF.

Вы можете узнать больше о поведении терминала, используя команду «man 4 tty» в терминале. Стандартная линейная дисциплина - это termios. Вы можете узнать больше о линейной дисциплине termios, используя команду man termios.

+0

Не могли бы вы помочь мне понять, как работает 'getchar()'? Я думал, что у персонажа может быть только один персонаж за раз. Когда я ввожу строку, такую ​​как 'hdjshj' в терминал, и вводит конец файла, будет ли' getchar' хранить все количество символов сразу?Или он сохраняет символ, как только он вводится в терминал, и прекращает его хранить, когда встречается EOF? – Morpheus

+3

@Morpheus: Обработка символов, которые я обсуждаю в моем ответе, ниже/до того, как 'getchar' видит символы. 'getchar' является частью программного обеспечения вашей программы (связанного из программных библиотек), который управляет файлами и буферами. Это программное обеспечение вызывает что-то вроде системного вызова 'read' для получения байтов. Отдельно есть программное обеспечение, которое управляет «терминальным» окном, которое вы видите, и программное обеспечение, которое считывает символы с клавиатуры. Программное обеспечение терминала принимает символы с клавиатуры (через дополнительные уровни системного программного обеспечения) и обрабатывает их ... –

+2

@Morpheus: ... Как правило, программное обеспечение терминала запоминает обычные символы в буфере, который он поддерживает, и обрабатывает специальные символы различными способами. Например, когда он видит элемент управления-C, он может отправить сигнал на текущий процесс, чтобы прервать его. Когда он видит return/enter, он отправляет буферизованные символы и возвращает/вводит в текущий процесс. Когда символы отправляются в текущий процесс таким образом, системный вызов 'read' возвращает их вызывающему. Вызывающий является частью этого программного обеспечения, которое управляет файлами и буферами в вашей программе. ... –

7

Я только что понял. Вы должны нажать Ctrl + D + D. Удерживайте нажатой кнопку управления и нажмите D дважды. Я должен сказать, какая странная ключевая последовательность.

+0

Это не отвечает на вопрос: «Любая идея, как обеспечить EOF для mac osx?» – user3629249

+0

Он работает на mac! Спасибо – Hoto

8

Если вы хотите увидеть, что EOF имеет значение, как в терминале, вы можете ввести

stty all 

на мой макинтош, это дает выход -

speed 9600 baud; 24 rows; 80 columns; 
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl 
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo 
-extproc 
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8 
-ignbrk brkint -inpck -ignpar -parmrk 
oflags: opost onlcr -oxtabs -onocr -onlret 
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow 
-dtrflow -mdmbuf 
discard dsusp eof  eol  eol2 erase intr kill lnext 
^O  ^Y  ^D  <undef> <undef> ^?  ^C  ^U  ^V  
min  quit reprint start status stop susp time werase 
1  ^\  ^R  ^Q  ^T  ^S  ^Z  0  ^W  

Вы можете увидеть четыре линии вверх снизу, три ячейки в eof -^D.

Существует более полное описание here, где я нашел информацию.

Смежные вопросы