-
设备文件处理的时与磁盘文件的区别
先说几个比较直观的感觉。首先,在你通过键盘(一般是标准的输入的终端设备),输入字符,直到你输入的回车键(键盘上面的Enter为回车键,不是换行键;换行的ACCII为10,回车为13;换行在程序中的体现就是\n),你的程序才会有“反应”,给人一种好像就是回车后你的程序才接受到你输入的数据; 其次,你在程序中写一个printf(“This is a demo\n”);你会发现你的下一个输出就是在下一行的最左边开始输出的,但是,回车与换行的本身功能是:\r 为 return,回车,即使光标回到当前行的头。\n为 newline,换行,即光标移动到当前位置的下一行。 所以,说明进程将你的\n转化为了\r\n。而在Linux下出现这些的原因,就是因为在终端设备与进程之间的中间,还有一个终端驱动器,里面有终端驱动函数。这里有两张图,便于大家理解。
-
stty命令的作用
为了自己能够编写适合自己的终端驱动函数,即去修改终端驱动程序里面的设置。在Linux中有这个命令,就是stty。但是,这里我们自己来编写stty的命令。 -
所要用到的函数和结构体的解释
int result=tegetattr(int fd,strcut termios *info);
int result=tesetattr(int fd,int when,struct termios *info);
对于 struct termios结构体而言,基本上很多功能的改变都是通过掩码技术来解决的。关于struct termios的掩码的定义在#include<termios.h>中。 -
设置终端是否回显
//如果输入的命令参数是 y就打开回显,反之,关闭回显!
#include<stdio.h>
#include<termios.h>
#include<stdlib.h>
#define oops(s,x) {perror(s),exit(x);}
int main(int agc,char *agv[])
{
struct termios info;
if(agc==1)
{
exit(0);
}
if(tcgetattr(0,&info)==-1)
{
oops("tcgetattar",1);
}
if(agv[1][0]=='y')
{
info.c_lflag|=ECHO;
printf("\n");
}
else
{
info.c_lflag&=~ECHO;
printf("\n");
}
if(tcsetattr(0,TCSANOW,&info)==-1)
oops("tcsetattr",2);
return 0;
}
- 代码说明
通过看到这个代码,你就可以知道,对于你执行一次这个程序,如果是关闭回显,那么是对所有的程序,命令都是有效的。因为不同终端对应的内核驱动程序的是不同的,但是一个终端仅仅对应一个子程序而已,所以,你的程序在以后本次登陆注销之前,都是有效的! - 终端设备小结
进程和终端间的数据传输和数据处理是由终端设备驱动程序来负责的,终端驱动程序是内核的一部分。可以通过tesetattr和tegetattr函数来改变终端驱动程序里里面的设置