很多人认为文件是一些存储在磁盘上的数据,但是Linux采用了一种更为抽象的方法。将设备抽象成文件。设备文件和普通文件一样具有文件名、另一个i节点号、一个文件所有者、一个权限位集合和近修改时间。平时了解的和文件有关的所有内容都将被运用于终端和其他的设备。
  普通文件,即常用的磁盘文件由字节组成,磁盘文件中的字节数是文件大小。而设备文件是链接,不是容器。键盘和鼠标不存储点击数:)设备文件的i节点存储的是指向内核的子程序的指针,而不是文件的大小和存储列表。内核中传输设备数据的子程序被称为设备驱动程序。
  文件类型的区别体现在i节点上:
  磁盘文件的i节点包含指向数据块的指针列表
  设备文件的i节点包含一个指向内核中设备驱动程序的指针
  磁盘连接和设备连接
  与磁盘文件的连接通常包含内核缓冲区,即磁盘连接具有缓冲区这样一个属性。到终端的连接则不同,进程需要尽快的将数据传送出去。
  也是说,二者的连接属性不同,针对于某一个特定的文件与设备的连接,可以思考:1.连接有哪些属性?2.如何检测当前属性?3.如何改变当前属性?
  关于2和3的答案,是使用系统调用fcntl,文件描述符的属性被编码在一个整数的位中。fcntl通过读写该整数位来控制文件描述符。
  如:

 

#include<fcntl.h>
int s;
s = fcntl(fd, F_GETFL);
s |= OSYNC;
result = fcntl(fd, F_SETFL, s);

  从内核中读取设置到变量,修改变量值,将设置返回内核,是Linux中读取和修改连接属性的典型方法。
  fcntl并不是仅有的用来设置文件描述符属性的方法。通常在打开一个文件时,应该知道需要怎样的设置。可以通过系统调用open的第二个参数的一部分来设置文件描述符的属性。
  如: fd = open(FILE, OWRONLY | O_APPEND | O_SYNC );