Сигнал 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?
Ответы
Ответ 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. Я должен сказать, какая странная ключевая последовательность.