请问:关于C语言中getc(stdin) 读取键盘缓冲区中的输入的问题?
C语言中:getc(stdin)能取得键盘缓冲区中的一个字符:如:#include<stdio.h>voidmain(void){chara;a=getc(s...
C语言中:getc(stdin) 能取得键盘缓冲区中的一个字符:如:#include<stdio.h>void main(void){char a;a=getc(stdin);printf("%c",a);} 以下是stdio.h 中的部分源码:struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};typedef struct _iobuf FILE;_CRTIMP int __cdecl _filbuf(FILE *);#define getc(_stream) (--(_stream)->_cnt >= 0? 0xff & *(_stream)->_ptr++ : _filbuf(_stream)) #define stdin (&_iob[0])#define stdout (&_iob[1])#define stderr (&_iob[2])_CRTIMP int __cdecl getc(FILE *);_CRTIMP extern FILE _iob[]; 从上面我们知道,getc()的参数是 一个可以指向 FILE 类型的变量,同时也知道 getc()的实现也知道 getc(stdin) 中的stdin 是(&_iob[0])。所以我们知道 :_stream=&_iob[0]; 从上面我们知道_iob[] 是一个FILE数组,a=getc(stdin); 当程序执行到这里时,是怎么确定 _iob[0]._cnt的值的呢?即:问题1: --(_stream)->_cnt >= 0 中(_stream)->_cnt的值是那里来的? 问题2:0xff & *(_stream)->_ptr++,_ptr _ptr值是怎么来的?问题3:_filbuf(_stream)) 是什么意思?主要要问:getc() 是怎么实现从 键盘缓冲区中取得一个字符的?
展开
2个回答
展开全部
1、有个叫做PCB的东西,叫做:进程调度表。这张表里维护着每个进程打开的文件、进程的上下文等信息。_iob[]就是存在于PCB中,而PCB又是由内核维护的,内核维护着设备,stdin是标准输入设备文件流指针,虽然_iob[]是存在于用户空间,但是内核会通过一系列的系统调用来维护他们。从(_stream)->_cnt 和getc(_stream)可以看出,_stream实际上就是FILE,通过看头文件中的typedef struct _iobuf FILE可以看出,_stream、FILE、_iobuf实际上是同一个东西,而_cnt就是在FILE指向的结构体里,它表示该缓冲区内有多少个字符。而缓冲区中的字符是内核通过监控输入设备然后copy进去的,所以如果_cnt为0的时候,getc就会调用_fillbuf(_stream)这个系统调用来重新填充缓冲区,也就是向内核请求将用户输入的字符拷贝到用户空间的缓冲区里。
2、_ptr是一个指向缓冲区某一位置的指针,其实,每个缓冲区相当于一个栈,而这个_ptr相当于栈顶指针,因为非服务器PC机操作系统基本上都是小端存取,所以栈指针是向下增长的,每增加一个数据,栈指针就自减,每读取一个数据,栈指针就自增。而0xff&是为了取一个字符,这样做可以忽略_ptr指针的类型,以便以后可以修改_ptr的类型。
3、_fillbuf(_stream)的意思我第1个回答中已经回答了。
4、getc()的流程。如果缓冲区中有字符,那么直接从缓冲区读取,如果没有,那么就调用_fillbuf(_stream)这个系统调用向内核申请,内核会监控标准输入设备,一旦有输入了就立马返回给用户;如果stdin经过了重定向,那么内核就会读取重定向后的文件或者设备。
相信这些已经很详细了,你应该能看懂。
2、_ptr是一个指向缓冲区某一位置的指针,其实,每个缓冲区相当于一个栈,而这个_ptr相当于栈顶指针,因为非服务器PC机操作系统基本上都是小端存取,所以栈指针是向下增长的,每增加一个数据,栈指针就自减,每读取一个数据,栈指针就自增。而0xff&是为了取一个字符,这样做可以忽略_ptr指针的类型,以便以后可以修改_ptr的类型。
3、_fillbuf(_stream)的意思我第1个回答中已经回答了。
4、getc()的流程。如果缓冲区中有字符,那么直接从缓冲区读取,如果没有,那么就调用_fillbuf(_stream)这个系统调用向内核申请,内核会监控标准输入设备,一旦有输入了就立马返回给用户;如果stdin经过了重定向,那么内核就会读取重定向后的文件或者设备。
相信这些已经很详细了,你应该能看懂。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询