Подтвердить что ты не робот

Сигнал EOF в терминале mac osx

Меня озадачивает вопрос 1.5.2 в K & R. Я когда-то искал googled и узнал, что я должен предоставить вход EOF после ввода символов.

long nc = 0;

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

return 0;

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

stty all

на моем mac, это дает результат -

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.

Здесь более полное описание здесь, где я нашел информацию.

Ответ 3

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