Linux操作系统-文件(1)

Linux操作系统—文件(1)(2015-7-21)

分类:Linux操作系统

总述:

  在LINUX中,几乎任何事物都可以用一个文件来表示。Linux中的文件类型多样,既包含普通的磁盘文件,也包含特殊的硬件设备文件,管道(PIPE)文件,套接字(socket)文件和目录文件等。在C语言的编程环境中,与文件有关的操作主要是I/O(输入输出)操作。Linux环境下的I/O操作分为两类:
- 基于文件描述符的底层系统调用I/O
- 基于流的C语言标准库函数调用I/O

基于文件描述符的底层系统调用I/O

一:Linux文件I/O概述

  Linux中,文件系统被组织成一树的形状,树枝是目录,树叶是文件。其中的目录也是一类特殊的文件。另外,Linux中用于进程间通信的管道和用于网络通信的socket,也都以文件接口的方式提供服务。因此,文件操作编程是其它应用编程的基础之一。
  文件为操作系统服务和设备提供了一个简单而一致的接口,大多数Linux文件I/O只需要用到5个函数:open, read, write, lseek和close。除此之外,使用stat, access等其它I/O函数可以获取或设置文件的状态和权限等信息。对于目录文件的操作,Linux则提供了一些简单而特殊的编程接口。

文件和目录
  • 文件的属性被保存在文件的索引节点(inode)中。
  • 索引节点是文件系统中的一个特殊的数据块,用以保存文件自身的属性,包含了如下的信息:

    1. 文件使用的设备
    2. 索引节点号
    3. 文件访问权限和文件类型
    4. 文件的硬连接数
    5. 所有者的用户ID
    6. 组ID
    7. 设备文件的设备号
    8. 文件大小(单位为字节)
    9. 包含该文件的磁盘块的大小
    10. 该文件所占的磁盘块
    11. 文件的最后访问时间
    12. 文件的最后修改时间
    13. 文件状态的最后改变时间
  • 什么是目录?Linux文件系统将文件的索引节点号和文件名同时保存在目录中。目录是用于保存其它文件的节点号和名字的文件,是将文件的名称和它的索引节点号结合在一起的一张表。目录中每一对文件名称和索引节点号称为一个“连接”。目录文件中的每个数据项都是指向某个文件节点的连接。删除一个文件时,实质上是删除目录中与该文件对应的数据项,同时将文件的连接数减1。

  • 通常文件中包含一定的数据,磁盘中的普通文件和目录文件都有相应的磁盘区域存储数据。这些数据是存储在由索引节点指定的位置上的。而其他一些文件,如设备文件等,则不具有这样的磁盘存储区域。
文件和设备

  硬件设备在Linux中通常也被映射为文件。这些设备文件被放在Linux的/dev目录下。硬件设备可分为字符设备和块设备,两者的区别在于是否需要一次读写一整块,比如:
- 键盘:是一种字符设备,一次仅能读取一个字节。
- 硬盘:是一种块设备,每次至少读写一个扇区

  Linux环境下一类比较重要的设备是终端设备。终端是一种字符设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。比较重要的终端设备有:
- 控制终端:代表进程的控制终端(键盘和显示屏或键盘和窗口)
- 控制台终端:代表控制台。错误信息和诊断信息通常会被发送到这个设备(打印终端,虚拟控制台,控制台窗口)
- /dev/null:代表空设备,所有写向这个设备的输出都将被丢弃,而读设备会立即返回文件尾标志。空设备通常用于输出重定向,以忽略某些错误输出。

系统调用和标准函数库
  • 系统调用:UNIX/Linux内核直接提供的编程接口,在内核空间运行。
  • C语言标准函数库:由一些函数构成的集合,完全运行在用户空间,其中可能使用系统调用来完成诸如访问硬件设备的底层功能。

注意:直接使用底层系统调用进行I/O操作的效率非常底下。原因如下:
1. 执行系统调用时,Linux必须从用户空间切换到内核空间,然后再切换回来。
2. 硬件会限制系统调用一次所读写的数据块大小,如块设备。

为此,应让每次系统调用完成尽可能多的工作。这正是C语言标准函数库所做的。C语言标准函数库带有缓冲机制,允许在缓冲区满或必须的情况下才使用底层的系统调用,这样减少了系统调用的次数,提供了效率。另外,有的库函数完全不用系统调用,只在用户空间完成特定的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章