假设我有一些代码可以执行此操作:
while(1) {
scanf("%c", &key);
// if E or e, exit
if (key == 'E' || key == 'e')
break;
}
这显然不会占用甚至单个核心的所有资源。它只是......“坐在那里”,直到有人真正按下E.我的问题是:运行时如何发现它不应该占用核心的所有资源而只是等待scanf? scanf是一个特殊情况,因为它是I / O,因此操作系统安排它直到有效按下一个键?我可以通过在循环中添加while
来以某种方式强制它a++
吗?
答案 0 :(得分:6)
scanf是一种特殊情况,因为它是I / O,因此是OS计划 直到钥匙被有效按下
这正是发生的事情。在这种情况下,scanf
是阻止操作。也就是说,如果它不能立即执行(输入缓冲区中没有任何内容),操作系统只会让您的进程进入睡眠状态,记住在出现问题时将其唤醒。
我可以以某种方式迫使它一直在说,添加一个 循环中的一个++
a++
不会改变任何内容。只要您有长时间等待的阻止呼叫,就无法挂住CPU。
直到有效按下某个键
在Linux中输入通常是“熟”。也就是说,按下单个键通常不够(在进程有机会查看数据之前,您还需要点击返回)。
正如Basile在评论中正确提及scanf
本身可能并不总是阻止。如果stdio缓冲区scanf
中有足够的输入,则只返回它。如果没有,则会调用可以阻止的read(2)
。