我的应用程序是使用Eclipse CDT Neon(4.6.2RC3)和gcc(Debian 6.3.0-18)6.3.0 20170516构建的
#include <stdio.h>
#include <stdlib.h>
int
main()
{
for (int i = 0;;i++) { /* Loop through characters. */
int ch;
ch = getc(stdin); /* Read the next character. */
if (i < 100 || i > 67730) fprintf(stderr, "%i(%i) ", i, ch);
else if (i == 100) fprintf(stderr, " ----- ");
if (ch == EOF)
break; /* Exit loop on end-of-file. */
}
fprintf(stderr, "\n\n*** finished successfully ***\n");
return 0;
}
以下是我的编译选项:-O0 -pedantic -Wall -Wextra -c -ggdb -fmessage-length=0 -Wno-implicit-function-declaration
。我是在管道传输到stdin
的输入文件的帮助下运行的。
当我从控制台运行它时,一切都很好。这是从控制台运行时正常输出的结束:
./myprogram < inputfile.pdf
67825(32) 67826(54) 67827(10) 67828(10) 67829(12) 67830(-1)
*** finished successfully ***
但是当我从Eclipse CDT以调试模式运行它时,它会在EOF(67830th)之前的最后一个字符(67829th)无限期等待,程序永远不会退出。如果我暂停执行,我可以检查它是否被卡在ch = getc(stdin);
行内。这是此时的堆栈:
Thread #1 [ArithmeticCoder] 29598 [core: 5] (Running : User Request)
Thread #1 [myprogram] 29598 [core: 6] (Suspended : Signal : SIGINT:Interrupt)
__read_nocancel() at /build/glibc-p3Km7c/glibc-2.24/io/../sysdeps/unix/syscall-template.S:84 0x7ffff7811700
_IO_new_file_underflow() at /build/glibc-p3Km7c/glibc-2.24/libio/fileops.c:600 0x7ffff77a9a00
__GI__IO_default_uflow() at /build/glibc-p3Km7c/glibc-2.24/libio/genops.c:413 0x7ffff77aab02
_IO_getc() at /build/glibc-p3Km7c/glibc-2.24/libio/getc.c:38 0x7ffff77a54f0
main() at /.../WorkSpace/myprogram/src/myprogram.c:20 0x555555554f08
我试过了:
fgetc
非常相似,但结果相同。ch = getc(stdin); if (ch == EOF)
替换int s = fread (&ch, 1, 1, stdin ); if (ch == EOF || s == 0)
,结果是一样的!我没想到,因为他们的行为确实不同。我的设置可能会出现什么样的错误?
请问好吗?