You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言read读取STDIN_FILENO时为何判断nread返回值不等于1?

关于代码中nread != 1判断的逻辑说明

首先要明确POSIX标准下read()系统调用的返回值规则:

  • 调用成功时返回实际读取到的字节数,该数值可能小于调用时传入的期望读取字节数
  • 读取到输入流末尾(EOF)时返回0
  • 调用出错时返回-1,同时会设置全局变量errno标识具体错误类型

这段代码的核心目的是从标准输入中成功读取1个字节存入字符变量c,才会继续执行后续逻辑。循环条件判断nread != 1的本质是:只要本次read调用没有成功读到整整1个字节,就停留在循环内重试,直到读取到1个字节满足条件,才会跳出循环继续向下执行。

循环内的分支处理逻辑

进入循环就代表本次read没有拿到目标的1个字节,代码对不同情况做了区分处理:

  • 当nread == -1时代表读取出错,此时如果错误码不是EAGAIN,就说明出现了不可恢复的错误(比如无效文件描述符、IO错误等),直接调用quit("read")终止程序报错。
    单独放行EAGAIN错误是因为:如果标准输入被设置为非阻塞模式,当下没有数据可读时,read不会阻塞等待数据到来,会直接返回-1并将errno设为EAGAIN,这属于临时性的无数据状态,不属于致命错误,不需要退出程序,回到循环开头重新尝试读取即可。
  • 当nread == 0时代表碰到了标准输入的EOF(比如终端下用户按下Ctrl+D结束输入、输入流被对端关闭),此时没有读到有效字节,会自动回到循环开头重新尝试读取。

内容的提问来源于stack exchange,提问作者Berkan Kurt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:01:04