linux下的文件分为磁盘文件和设备文件
一 设备文件
- 设备也是一种文件,所有设备(打印机,鼠标,键盘,屏幕等)都被作为一个文件显示在文件系统树上----设备具有文件名,都存在/dev目录下
- 设备不仅具有文件名,还支持与文件相关的系统调用—>设备的打开,读取,写入,关闭等操作都可以通过系统调用open,read,write,close,stat,lseek来完成.
- 终端也是一种设备文件,通常认为其是键盘和显示屏,但是其不支持lseek函数操作。(tty命令可以查看当前终端名称)。
- 设备文件的属性(
ls -l
)大致与磁盘文件一样,只是在文件大小那一列有所不同
* 设备文件不是一个容器,而是一个链接,设备文件的i节点结构中存储指向内核中子程序的指针。内核中传输设备文件数据的子程序被称为设备驱动程序(本质就是一个程序)
二 设备文件与磁盘文件的不同之处
ls -l
得出的文件属性中,设备文件在文件大小与文件所属组那一列比较特别- 设备连接的属性与磁盘连接的属性不同
- 磁盘文件的属性只需要一个int型变量即可
,而设备连接的属性则需要一个结构体(通过tcgetattr函数获得)来存储:
下面就磁盘连接的属性与终端连接的属性进行分析:
三 磁盘连接的属性
- 补充概念:一个 Linux 进程启动后,会在内核空间中创建一个 PCB 控制块,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。----》文件描述符时存储在内核中的
- 当用open打开磁盘文件获得一个文件描述符fd时,文件描述符对应一个控制变量,修改控制变量会修改文件描述符的属性,进而修改文件的属性。
- 实际操作时,就是将控制变量从内核中取出到进程(程序)中,进行修改,修改完再送回内存,fd根据控制变量的修改,来修改文件的属性
- 与之密切相关的操作函数为fcntl与open函数
- link性质在单人操纵文件方面的应用(可替代open函数的O_APPEND,O_EXCEL)—确保操作的原子性
四 终端连接的属性
- 终端连接的属性,通常由终端驱动程序来设置----》而stty命令可通过修改终端驱动程序来查看和修改终端连接的属性。
- 编写终端驱动程序,可以修改终端连接的属性
- termios结构体的理解
- tcgetattr函数与tcsetattr函数
- 编写步骤(类似磁盘连接):1-通过tcgetattr函数将终端连接的属性信息存放在一个新的termios结构体中----》2-在程序中修改完毕后,再利用tcsetattr函数将该新的termios结构体传进去。
五 其它设备连接的属性
总结
- 磁盘文件的属性由fcntl函数获得
- 终端连接的属性由tcgetattr函数获得
- 其他设备文件连接的属性由ioctl函数获得