如何检测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
相关产品推荐
相关产品推荐

