看下面的一个例子,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);
}