【问题标题】:Debugging read() system call - does not continue executing until CTRL-C is pressed调试 read() 系统调用 - 在按下 CTRL-C 之前不会继续执行
【发布时间】:2010-11-14 18:46:50
【问题描述】:

您好,我需要使用系统调用 read() 来读取 I/O。我有以下代码

//Reading in the commands
for(;;) {
    n = read( fd, buf, 128 );
    fflush(stdin);
    printf("---\n");
}

在我终止程序之前它不会打印“---”字符串,然后它会一次打印所有内容。我也尝试过刷新输入流,但没有运气。我对read() 不是很熟悉,所以我不知道它是如何工作的。我需要使用read() 的原因是因为我需要让CTRL-D 终止程序。有人能告诉我为什么会发生这种情况以及如何进行吗?提前致谢。

PS:我又做了一些测试,得到了一个有趣的结果:

for(i;i<3;i++) {
      if( read( fd, buf, 128 ) < 0) {
        printf("Read returned less than 0");
      } else {
          printf("Read is working\n");
      }
  }

删除“\n”字符使其在读取第三个输入后打印“Read is working”3 次。将字符放入其中将在读取每个输入后打印。

【问题讨论】:

  • 永远不要在 stdin 上调用 fflush - 它仅对输出流有效 - 在输入流上使用它会导致 未定义的行为

标签: c system-calls


【解决方案1】:

您需要检查“read”的返回值以检测 STDIN 上的 EOF(即按 Ctrl-D)。您发布的代码是一个无限循环。

【讨论】:

  • 是的,它假设无限循环,直到用户按下 CTRL-D。
  • 也 read() 返回它读入的大小。Ctrl-D 将返回 2,如果发生错误则返回负值。它会为 EOF 返回什么特别的东西吗?
【解决方案2】:

我仍然不知道它为什么会这样做,但是 fflush(stdout) 在它再次循环之前解决了这个问题。

对于我的原始代码:

//Reading in the commands
for(;;) {
    n = read( fd, buf, 128 );
    fflush(stdin);
    [Other statements]
    fflush(stdout);
}

解决了这个问题。仍然想知道为什么需要这样做。

【讨论】:

  • 请阅读上面关于fflush(stdin)的评论和/或阅读fflush的手册页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多