gpt4 book ai didi

c - 打印到控制台后自动插入 EOF

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:01 25 4
gpt4 key购买 nike

我有 2 个 .c 文件。一种是向控制台打印 1000 个伪随机数,另一种是要求用户从标准输入(一个接一个)输入一个整数,将它们存储在一个数组中,然后尝试查看其中是否有指定的数字。当用户输入 EOF 值时,流的输入终止,我会自动将其转换为 INT_MAX 以保持一致性。

现在我尝试通过 ./generate 1000 | 测试 find.c 程序./find 5

它有效,但我有点困惑,因为这表明在将 1000 个值打印到屏幕后,./generate 也会放置一个 EOF,否则为什么 ./find 会终止输入。

谁能解释一下这个过程是如何发生的? (如果是这样)谢谢。

最佳答案

“EOF 值”是一种错觉。

Ctrl-D是一个终端功能,它向从中读取文件的进程发出文件结束信号。没有值写入流。

程序将通过发现read(2) 来检测这个文件结束信号。系统调用返回 0,意思是“没有读取字节”。库将其转换为空指针、EOF 值、异常或它们用来指示没有更多数据可读的任何其他内容。

如果出现以下情况,您将获得相同的 0 字节读取:

  • 您尝试在关闭写入端后从管道读取数据。

    这就是您的管道示例中发生的情况。当./generate退出或以其他方式关闭其标准输出,读取输出的程序将重复读取 0 字节长。

  • 当文件指针位于末尾时,您尝试从文件中读取。如果你做了 ./find 5 < somefile 就会发生这种情况从文件提供输入。

  • 您正在从另一端关闭连接的套接字或 fifo 读取数据。如果您使用 socat 或 xinetd 将您的程序作为服务器运行,就会发生这种情况。

这种强大而通用的机制意味着处理用户输入的程序将自动处理文件、管道、套接字和您指向的任何其他内容。

关于c - 打印到控制台后自动插入 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com