o / s进程终端如何输入C代码?

时间:2017-08-02 00:04:43

标签: c

简介:我一直在关注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后处理的所有输入。

在前一种方式中,处理能力应该是平衡的,但后一种方式会立即将整个负载放在处理器上,这就是我想知道它是如何工作的原因。

1 个答案:

答案 0 :(得分:2)

正如评论者指出的那样,这个问题主要是询问操作系统如何实现输入和输出,因为你的getchar()调用很可能最终成为系统调用(内核空间中的一个函数)。

操作系统如何在没有缓冲的情况下实现此类调用的鸟瞰图如下所示:操作系统将使您的线程处于等待状态并在CPU上运行其他其他操作。当按下某个键时,驱动程序将让操作系统知道哪个将决定将其路由到哪个,在这种情况下是您的程序。它将程序从等待状态唤醒,并从系统调用返回密钥代码。

这里的神奇之处在于处理器能够将整个程序置于保持状态(等待时),执行其他操作,并在以后再次恢复。

真实操作系统将实现缓冲形式,可能在内核中,也可以在标准库中实现,getchar()在系统调用之上实现。将有抽象和重定向层。例如,在C标准中,输入和输出流表示为文件。

(我不是操作系统专家,所以如果我犯了严重的错误,请纠正我。)