简介:我一直在关注K& R,正如我的向导所建议的那样。我遇到了以下代码,我一直试图弄清楚背景中实际发生了什么。
代码:
// Program to count lines, words and characters in input
#include <stdio.h>
#define IN 1 // inside a word
#define OUT 0 // outside a word
int main()
{
int c, nl, nw, nc, state;
state = 0;
nl = nw = nc = 0;
while ((c = getchar()) != EOF)
{
++nc; // increment newchar count
if (c == '\n')
++nl; // increment newline count
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT)
{
state = IN;
++nw; // increment newword count
}
}
printf("%d %d %d\n", nl, nw, nc);
}
问题我明白输入输入后,需要按Ctrl + D(基于Linux / Mac的操作系统)插入EOF字符,最后将代码从while循环中打开以进行打印输出,但我无法弄清楚的是当我输入输入时背景中发生了什么。 输入是否同时处理,只是等待Ctrl + D(EOF字符)打印输出,或者是在处理完Ctrl + D后处理的所有输入。
在前一种方式中,处理能力应该是平衡的,但后一种方式会立即将整个负载放在处理器上,这就是我想知道它是如何工作的原因。
答案 0 :(得分:2)
正如评论者指出的那样,这个问题主要是询问操作系统如何实现输入和输出,因为你的getchar()
调用很可能最终成为系统调用(内核空间中的一个函数)。
操作系统如何在没有缓冲的情况下实现此类调用的鸟瞰图如下所示:操作系统将使您的线程处于等待状态并在CPU上运行其他其他操作。当按下某个键时,驱动程序将让操作系统知道哪个将决定将其路由到哪个,在这种情况下是您的程序。它将程序从等待状态唤醒,并从系统调用返回密钥代码。
这里的神奇之处在于处理器能够将整个程序置于保持状态(等待时),执行其他操作,并在以后再次恢复。
真实操作系统将实现缓冲形式,可能在内核中,也可以在标准库中实现,getchar()
在系统调用之上实现。将有抽象和重定向层。例如,在C标准中,输入和输出流表示为文件。
(我不是操作系统专家,所以如果我犯了严重的错误,请纠正我。)