一、区分/dev/tty、/dev/console、/dev/pts、/dev/ttyn /dev/ttySn
通常我们在linux下看到的控制台(console)是由几个设备完成的。分别是/dev/ttyN.通常使用热键 alt+Fn来在这些虚拟终端之间进行切换。所有的这些tty设备都是由linux/drivers/char/console.c和vt.c对应。
控制终端 /dev/tty指的是当前所处的终端,输出到此的内容只会显示在当前工作的终端显示器上,如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。这个终端文件可以由各个用户共享控制台终端 /dev/ttyn n(0到6) tty1,tty2就是不同的虚拟终端(virtual console)./dev/console 就是tty0 ,tty0则是当前所使用虚拟终端即激活的虚拟终端的一个别名,系统所产生的信息会发送到该终端上,实际上机器只有一个屏幕,也就是我们看到的这个屏幕,可以理解为console指向激活的那个tty,准确地说是激活的那个tty才将输出显示到console。历史上,console指主机本身的屏幕键盘,而tty指用电缆链接的其它位置的控制台(仅包含屏幕和键盘)。tty0是系统自动打开的,但不用于用户登录
伪终端 /dev/pts是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。由于可能有好几千个用户登陆,所以/dev/pts其实是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs) 。第一个用户登陆,console的设备文件为/dev/pts/0,第二个为/dev/pts/1,以此类推。这里的0、1、2、3不是具体的标准输入或输出,而是整个控制台。你可尝试 echo
"aaaaaa" > /dev/pts0、1、2……。
串行端口终端(/dev/ttySn)
串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev
/ttyS1)等,设备号分别是(4,0)、(4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标 准输出重定向到这些
特殊文件名上即可。例如,在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。
二、用ioct1函数操纵虚终端设备文件
虚终端,也叫虚屏,它的英文名字为virtual terminal,缩写为VT或vt。在Unix系统用户中,虚终端有着广泛的应用。它解决了主控台单一交互界面的限制,使用户可在保护当前界面的情况下启用另一界面去做另一工作。我们可利用Unix系统提供的系统调用来编制虚终端程序,并可把它加入到我们的应用程序中去。本人就在此虚终端程序的基础上编写了图形软件,它能够保存和恢复先前的界面。可利用ioct1函数操纵虚终端设备文件,实现与Unix系统内核的交互,得到我们所需要的服务。使用ioct1的具体形式如下: int ioct1(int filedes,int request,…/*参数*/) 其中filedes为打开的虚终端设备文件描述符,request为请求的服务,随后的参数可为各种数据类型,视具体情况而定。与虚终端有关的用于ioct1调用中
request值主要有以下几个:
VT_OPENQRY 查找一个可利用的虚终端。用于ioct1系统调用的参数是一个指向长整数的指针。该长整数的值将被置为第一个可利用的无进程在其上打开的虚终端的序号。如果没有可利用的虚终端,则该长整数的值被置为-1。VT_GETMODE 获取活动虚终端当前所在的状态。用于ioct1系统调用的参数是一个指向 vt_mode结构的指针。结构vt-mode定义如下:
struct vt-mode {
char mode;/* VT mode */
char waitv;/* if set,hang on writes when not active */
short relsig;/*signal to use for release request */
short acqsig; /*signal to use for display acquired */
short frsig; /*not use set to 0 */
}
在结构vt_mode中,mode字段的值可为VT_AUTO和VT_PROCESS,它们的宏定义如下:
#define VT_AUTO 0x00 /*自动切换*/
#define VT_PROCESS 0x01 /*进程控制切换*/
VT_SETMODE 设置虚终端模式(自动或进程控制)。用于ioctl系统调用的参数是一个″vt_mode″结构的指针(结构定义见VT_GETMODE)。
VT_GETSTATE 获取全部虚终端的状态信息。用于ioctl的系统调用的参数是一个指向vt_stat结构的指针,该结构定义如下:
struct vt_stat {
ushort v_active;/*活动的vt*/
ushort v_signal;/*要发送的信号(用于VT_SENDSIG)*/
ushort v_state; /*vt位掩码(VT_SENDSIG和VT_GETSTATE)*/
}