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

如何检测stdin是否关闭?现有代码遇Ctrl+D死循环的原因

问题原因及解决方法

你的代码逻辑存在两个核心问题,导致按下Ctrl+D后无限打印旧内容:

  • fcntl的判断逻辑无效
    按下Ctrl+D只是触发了EOF(文件结束),此时stdin的文件描述符并没有被关闭(EBADF错误仅在文件描述符本身无效时才会触发),所以fcntl(fileno(stdin), F_GETFD) != -1 || errno != EBADF这个条件会始终成立,循环无法终止。

  • fgets的返回值未被正确利用
    当stdin到达EOF时,fgets会返回NULL,但你的循环没有检测这个返回值,而是继续执行打印逻辑。此时buffer中保留的是上一次成功读取的内容,所以会反复打印旧数据,形成无限循环。

正确的实现方式

处理标准输入流的标准做法是直接通过fgets的返回值判断循环是否继续:

#define BUFFERSIZE 1024
char buffer[BUFFERSIZE];

while (fgets(buffer, BUFFERSIZE, stdin) != NULL) {
    /* 处理buffer内容的逻辑 */
    printf("%s", buffer);
}

当stdin到达EOF(按下Ctrl+D)或发生读取错误时,fgets返回NULL,循环自动终止,不会出现无限打印的问题。

内容的提问来源于stack exchange,提问作者Rando Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:40:42