Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
o/s如何处理C代码的终端输入?_C - Fatal编程技术网

o/s如何处理C代码的终端输入?

o/s如何处理C代码的终端输入?,c,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, s

简介:我一直按照导游的建议关注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);
}
//计算输入中的行、字和字符的程序
#包括
#在1//中定义一个单词
#在单词外定义0//
int main()
{
北卡罗来纳州、北卡罗来纳州、北卡罗来纳州、北卡罗来纳州;
状态=0;
nl=nw=nc=0;
而((c=getchar())!=EOF)
{
++nc;//递增newchar计数
如果(c=='\n')
++nl;//递增换行计数
如果(c=''| | c='\n'| | c='\t')
状态=输出;
else if(state==OUT)
{
状态=IN;
++nw;//递增新词计数
}
}
printf(“%d%d%d\n”,nl,nw,nc);
}

问题:我知道在输入后,需要Ctrl+D(基于Linux/Mac的操作系统)插入EOF字符,该字符最终将代码从while循环中分离出来以打印输出,但我无法弄清楚的是,在输入时后台发生了什么是同时处理输入并等待Ctrl+D(EOF字符)打印输出,还是在处理Ctrl+D后处理所有输入。


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

正如评论者指出的,这个问题本质上是问操作系统如何实现输入和输出,因为您的
getchar()
调用很可能以系统调用(内核空间中的函数)结束

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

这里的神奇之处在于处理器能够暂停整个程序(在它等待时),执行其他操作,然后在以后再次恢复

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


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

基本上你的问题是如何操作系统works@IlyaBursov我的问题是编译器将如何处理这段特定代码,而不是操作系统实际如何工作
您的问题应该合理界定范围。如果你能想象一整本书都能回答你的问题,那你问得太多了。
@HarshitJindal:简单的回答是,如果你在终端上打字,那么默认情况下,每次按Enter键时,都会向你的程序发送一大块输入。“平衡”并不特别重要,因为循环可能会在手指再次按下回车键之前完成对输入的处理。您可以通过在循环中添加策略性放置的输出函数来确认这一点,这样您就可以看到它何时工作。您可能会在中找到一些有用的信息。谢谢。我明白这一点。简单有效的答案