Unix系统中一切都是文件的概念深入人心,设备同普通文件及目录一样,同样是一种文件,但与普通文件存在许多区别。
首先体现在文件属性上:如图所示。除了权限最开头的字符变为”c”,在原本应该显示SIZE的地方显示了16,1这样的数字。
这里就引出了设备文件的一个重要的特点,普通的文件是一个存储数据的容器,size记录文件容纳的数据量;而设备文件是链接,而非容器。对于设备文件来说,i-节点存储的是指向内核子程序的指针,而并非文件的大小等信息,因此设备的i-节点对应的是内核子程序。而实际上内核中传输设备数据的子程序就被是我们常说的设备驱动程序。内核通过调用设备驱动程序的read、write等部分来进行设备的读取数据操作。
图中的16,1所代表的含义指对此终端(/dev/ttys001)进行数据传输的代码是在设备-进程表中编号为16的子设备,也就是编号为16的设备驱动程序,同时传入一个1参数。
设备文件的另一个重要的特点就是其丰富多样的属性。如磁盘具有缓冲、自动添加模式等属性,终端具有控制回显,控制大小写输出等属性。初始化设备文件时,属性存在默认设置,同时也可在调用函数时将其作为参数传入来控制属性。而修改设备文件时,也有许多系统调用可供使用,如修改磁盘属性的(fcntl),修改终端的stty命令及系统调用(tsgetattr、tsetattr),其他设备的系统调用(ioctl)等。
在修改设备文件的属性须遵循三步:1、获取设置2、修改设置3、存储设置,非常重要。而在具体操作时,可以通过掩码来方便地控制设备属性。
-测试位:if(flagset & MASK)
-置位: flagset |= MASK
-清除位:flagset &= ~MASK