计算机是如何处理按键输入的字符的

13 篇文章 0 订阅
7 篇文章 0 订阅

看下面的一个例子,shell的一个基本实现的例子,可以编译运行一下。 


当从键盘按下一个键时, 电脑会产生一个中断,有一个中断接收程序,来接收这个字符。中断接收程序对接收到的程序进行判断处理,比如说是控制字符还是可显示字符,对每个控制字符改怎么处理啊,对可显示字符要不要写入RxBUF啦,等等情况,最后接收完了,再回到主循环。什么时候接收完呢,就是中断接收程序接收到了一个Enter字符,Enter字符是一个控制字符!你按下一个Enter键,中断接收程序看到这个是一个Enter字符,也写入RxBUF,然后产生一个标志,主程序发现标志被设定为True,然后就对RxBUF里面的数据进行处理。 比如,你按了几个可显示字符进去后,发现最后一个输错了,这个时候你按了一个BACKSPACE键,BACKSPACE键是一个控制字符,中断服务程序接收到了这个BACKSPACE字符后,发现,哎,是控制字符BACKSPACE,就把刚刚那个字符从RxBUF里面个删除掉,然后怎么让用户知道已经删除了呢,就向屏幕printf一个空格键就好了(有一种欺骗用户的意思),就把刚刚的那个字符给覆盖掉了。

如果是原子输入,就是不需要用到BUF了,中断接收程序接收完这个字符后,直接把这个字符给主程序了!控制字符也是,控制字符由主程序来判断处理。


重要:/*有些控制字符是写入RxBUF的,比如Enter字符*/。

重要补充:/* 控制分为嵌入控制和外部控制吧,比如Enter和tab字符等是嵌入在文本字符里面的,而backspace,delete等是不写在文本里面的。enter字符,只是被中断服务程序不但写入,还表明从终端输入的结束。*/

从终端获得输入的时候,你输入每一个字符,终端服务程序会把你输入的每一个字符都回显print到屏幕。



“  按键-》中断接收-》中断服务程序-》设标志-》主循环  ”

跟实验室开发的程序的设计模式是一样一样的。


//shell-like function

#include "apue.h"

#include <sys/wait.h>

int main(int argc, char *argv[])

{

        char buf[MAXLINE];

        pid_t pid;

        int status;


        printf("%% ");

        while (fgets(buf, MAXLINE, stdin) != NULL)

        {

                if (buf[strlen(buf)-1] == '\n')

                {

                        buf[strlen(buf)-1] = 0;

                }


                if ((pid  = fork()) < 0)

                {

                        printf("err\n");

                }

                else if (pid == 0/* child */

                {

                        execlp(buf, buf, (char *)0);

                        exit(127);

                }


                /*  parent */

                if ((pid = waitpid(pid, &status, 0)) < 0)

                {

                        printf("error\n");

                }


                printf("%% ");

        }

        return(0);

}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值