1

假设我有一些代码可以做到这一点:

while(1) {
      scanf("%c", &key);
      // if E or e, exit
      if (key == 'E' ||  key == 'e')
          break;
}

这显然不会占用哪怕一个核心的所有资源。它只是......“坐”在那里,直到有人真正按下 E。我的问题是:运行时如何发现它不应该占用一个核心的所有资源,只是等待一个 scanf?scanf 是一种特殊情况,因为它是 I/O,因此操作系统会调度它直到有效按下一个键?我可以while通过说a++在循环内添加一个来强制它一直运行吗?

4

1 回答 1

6

scanf 是一种特殊情况,因为它是 I/O,因此操作系统会调度它直到有效按下某个键

这正是正在发生的事情。在这种情况下scanf阻塞操作。也就是说,如果不能立即执行(输入缓冲区中没有任何内容),操作系统只会让您的进程进入睡眠状态,并记住在出现问题时将其唤醒。

我可以通过说在循环中添加 a++ 来强制它一直处于等待状态吗

a++不会改变任何事情。只要您有长时间等待的阻塞调用,您就无法锁定 CPU。


直到一个键被有效按下

在 Linux 中,输入通常是“熟的”。也就是说,按一个键通常是不够的(您还需要在进程有机会查看数据之前按回车键)。


正如 Basile 在评论中正确提到的那样,scanf它本身可能并不总是阻塞。如果 stdio 缓冲区中有足够的输入,scanf则只会返回它。如果不是,它将调用read(2)which can block。

于 2013-04-18T15:54:18.267 回答