gpt4 book ai didi

c - 从标准输入读取()

转载 作者:IT王子 更新时间:2023-10-29 00:22:44 24 4
gpt4 key购买 nike

考虑以下代码行:

while((n = read(STDIN_FILENO, buff, BUFSIZ)) > 0)

根据我的理解,read/write 函数是非缓冲 I/O 的一部分。那么这是否意味着 read() 函数每次从 stdio 调用时只读取一个字符?或者换句话说,n 的值将是

    -1  in case of error
n = 0 in case of EOF
1 otherwise

如果不是这样,上面的read()函数什么时候返回,为什么?

注意:我还认为 read() 会一直等到它从标准输入成功读取 BUFSIZ 个字符。但是,如果可供读取的字符数少于 BUFSIZ,会发生什么情况?读取将永远等待或直到 EOF 到达(Ctrl + D 在 unix 上或 Ctrl + Z 在 windows 上)?

此外,假设 BUFSIZ = 100stdin = ACtrl+D(即 EOF 紧跟在单个字符之后)。现在 while 循环 将迭代多少次?

最佳答案

read() 的行为方式取决于正在读取的内容。对于常规文件,如果您要求 N 个字符,如果可用,您将获得 N 个字符,如果文件末尾介入,则少于 N。

如果 read() 以规范/熟模式从终端读取,tty 驱动程序一次提供一行数据。因此,如果您告诉 read() 获取 3 个字符或 300 个字符,read 将挂起,直到 tty 驱动程序看到换行符或终端定义的 EOF 键,然后 read() 将返回行中的字符数或您请求的字符数,以较小者为准。

如果 read() 正在以非规范/原始模式从终端读取,read 将立即访问按键。如果您要求 read() 获取 3 个字符,它可能会返回 0 到 3 个字符,具体取决于输入时间和终端的配置方式。

read() 将在面对信号时表现不同,返回少于请求的字符数,或者如果在任何字符到达之前信号中断读取,则返回 -1 并将 errno 设置为 EINTR。

如果描述符已配置为非阻塞 I/O,则 read() 的行为会有所不同。如果没有立即可用的输入,read() 将返回 -1,errno 设置为 EAGAIN 或 EWOULDBLOCK。这适用于套接字。

如您所见,调用 read() 时应该准备好迎接惊喜。您不会总能获得请求的字符数,并且您可能会遇到非 fatal error ,例如 EINTR,这意味着您应该重试 read()。

关于c - 从标准输入读取(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8975521/

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