mac osx终端中的信号EOF

wvt8vs2t  于 2023-05-16  发布在  Mac
关注(0)|答案(4)|浏览(431)

我被K&R中的1.5.2问题难住了。我在谷歌上搜索了一段时间,发现我必须在输入字符后提供EOF输入。

long nc = 0;

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

return 0;

我尝试了command-D和control-D作为EOF输入,但没有任何效果。如何为Mac OS X提供EOF?

pgx2nnw8

pgx2nnw81#

默认情况下,macOS(以前的OS X和Mac OS X)软件在行首按下Control-D时识别EOF。(我相信其他版本的Unix也有类似的行为。
详细地说,实际操作是,当按下Control-D时,终端的输入缓冲区中的所有字节都被发送到使用终端的附加/前台进程。在一行的开始,缓冲区中没有字节,因此进程被告知有零个字节可用,这充当EOF指示符。
此过程兼作在行尾之前向流程传递输入的方法:用户可以键入一些字符并按下Control-D,这些字符将立即发送到进程,而无需通常等待按下回车键。在执行此“立即发送所有缓冲字节”操作之后,缓冲区中将不留下任何字节。因此,当第二次按下Control-D时,它与一行的开头相同(不发送字节,并且进程被赋予零字节),并且它的行为类似于EOF
您可以通过在终端中使用命令“man 4 tty”来了解有关终端行为的更多信息。默认的行规则是termios。您可以通过使用man termios命令来了解有关termios行规则的更多信息。

68bkxrlz

68bkxrlz2#

如果您想查看终端中的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。
有一个更完整的描述here,这是我找到信息的地方。

7eumitmz

7eumitmz3#

我刚想明白。你必须按Ctrl+D+D。按住控制键并按D两次。我不得不说这是一个多么奇怪的按键序列。

zsohkypk

zsohkypk4#

在macOS Monterey中,ctrl + D是我需要启动EOF的所有内容。
我是这么做的:
1.使用gcc编译源代码
1.运行可执行文件
1.按ctrl + D在新行的最开始发送EOF
我在程序的开头和结尾添加了两个额外的print,以验证ctrl + D实际上可以工作。

相关问题