gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:36 25 4
gpt4 key购买 nike

简介:我一直按照我的向导的建议关注 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后所有输入都处理

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

最佳答案

正如评论者所指出的,这个问题本质上是在询问操​​作系统如何实现输入和输出,因为您的 getchar() 调用很可能最终会成为系统调用(内核空间中的一个函数)。

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

这里的神奇之处在于处理器能够暂停整个程序(在等待时),做其他事情,然后再恢复它。

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

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

关于c - o/s如何处理C代码的终端输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45449433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com