web-dev-qa-db-ja.com

信号EOF mac osx端末

K&Rの1.5.2の質問には困惑しています。私はしばらくグーグルで検索し、文字を入力した後にEOF入力を指定する必要があることを知りました。

long nc = 0;

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

return 0;

EOF入力としてcommnad-Dとcontrol-Dの両方を試しましたが、何も機能しませんでした。macosxにEOF?

35
Morpheus

デフォルトでは、OS X(以前のMac OS X)端末は次の場合にEOFを認識します Ctrl-D 行の先頭で押されます。

詳細には、実際の操作は、 Ctrl-D が押されると、端末の入力バッファ内のすべてのバイトが、端末を使用して実行中のプロセスに送信されます。行の先頭では、バッファにバイトがないため、プロセスは使用可能なバイトがゼロであると通知され、これはEOFインジケータとして機能します。

この手順は、行末までにプロセスに入力を配信する方法としても機能します。ユーザーはいくつかの文字を入力して、 Ctrl-D、文字はすぐにプロセスに送信され、Enter/Returnが押されるのを通常待つことはありません。この「バッファリングされたすべてのバイトをすぐに送信」操作が実行された後、バイトはバッファに残りません。そうするとき Ctrl-D もう一度押すと、行の先頭と同じになり(バイトは送信されず、プロセスには0バイトが与えられます)、EOFのように動作します。

ターミナルでコマンド「man 4 tty」を使用すると、ターミナルの動作について詳しく知ることができます。デフォルトの回線制御はtermiosです。コマンドman termiosを使用して、termios回線制御の詳細を確認できます。

62

端末で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     

下から4行が表示されます。eofの3つのセルは^ Dです。

より詳細な説明があります here ここで情報を見つけました。

11
RADan

私はちょうどそれを理解しました。押す必要があります Ctrl+D+D。コントロールを押しながら D 二回。なんと奇妙なキーシーケンスかを言わなければなりません。

7
Morpheus