闇の光

读书笔记 经验感受

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在UNIX和Linux环境中,文件显得特别的重要,因为在Linux环境下只为操作系统服务以及设备提供了一个简单一致的接口。所以在Linux下,everything is a file,至少大多数是这样。而这也就是说,一般情况下,程序所使用的磁盘文件、串行端口、打印机以及其他设备,这些都是通过同样的方法——使用一个相关的文件。当然,也有一些例外,比如网络连接。总之我们所需要的只是使用五个基本的函数:open、close、read、write以及ioctl。

Linux下,目录同样也是文件,一种比较特别的文件。在现代UNIX版本中,包括Linux,甚至是超级用户,都不能对目录直接进行写操作。所有的用户通常都使用高级的opendir/readdir接口来读取目录,而勿需知道目录实施过程中系统所作的具体详情。

事实上,在Linux下,几乎所有的事物都被描绘成一个文件,或者要使之有效需要通过一些特别的文件。即使是这样,那些同我们所了解的常规文件不同的差异,依旧保留着普遍的原则。

Directories

同它的目录一样,一个文件有一个名字和一些属性或管理信息,也就是文件的创建修改日期以及权限。这些属性都存储在文件的节点中,一种在文件系统中比较特别的数据块,并且它的信息内容还包括文件的长度以及磁盘上节点所存储的位置。因此,对我们而言,系统使用的是文件的节点号,而目录结构只是为这个文件命名而已。

一个目录就是一个拥有其他文件的节点号以及名字的文件,而每一个目录的入口就是到一个文件节点的一条链接,因此移除了文件名就是移除了与之对应的链接(你可以使用ln -i来查看一个文件的节点号)。使用ln命令,你可以在不同的目录里链接同一个文件。

当你删除了一个文件,则这个文件所对应的目录入口将被移除,且到此文件的链接数也将向下减一。而此文件的数据可能依旧是有效的,因为它通过其他的链接,从而访问相同的文件。直到当一个文件的链接数(此数字在ls -l所显示的权限之后)变为零时,节点以及它所引用的数据块才不再被使用并被标示为释放。

文件在目录中都将被重新排列,在这些目录中可能同时也含有子目录,而这就构成了我们常见的文件系统分层结构。一个用户,名叫neil,通常他的文件都被存储在home目录下,比如/home/neil,其中可能还包括一些存储E-mail、商业信件、工具程序等等的子目录。要注意的是UNIX和Linux下大多数shell都可以通过一个标号直接访问你的用户目录,这个符号就是“~”,而要访问其他用户则键入:~user,将直接访问所键入的user的用户目录。如我们所知道的,对每个用户而言,home目录通常为他们创建一个对应的子目录,即存放于/home下。

注:在文件名参数中,标准库函数不支持shell速记标号“~”,因此在程序设计时,必须使用文件的真实名称。

/home目录是根目录/下的一个子目录,根目录是文件分层结构的顶点,它包含系统所有的子目录。正常情况下,根目录包括存贮系统程序的/bin、存储系统配置文件的/etc、存贮系统库文件的/lib。另外,还有描绘物理设备并为这些设备提供接口的文件都存贮在目录/dev下。下面是一个典型的Linux目录分层结构的一部分:


Files and Devices

每一种硬件设备通常都映射到文件当中,比如,作为超级用户,你可以挂载一个IDE CD-ROM设备为一个文件:

# mount -t iso9660 /dev/hdc /mnt/cdrom
# cd /mnt/cdrom

上面的操作会将CD-ROM设备(在此情况下第二块主要的IDE设备将在开机期间一直装载在/dev/hdc下;其他类型的设备在/dev下拥有不同的入口)当前的内容作为文件结构挂载到/mnt/cdrom下。之后,你就可以像访问平常的文件一样来访问CD-ROM下的目录了,当然,这些目录中内容都是只读的。

在UNIX和Linux下有三种重要的设备文件,分别是:/dev/console、/dev/tty、/dev/null。

  • /dev/console
  • 此设备文件代表系统控制台,错误信息和诊断信息通常都发送到此。每个UNIX系统都会指定一个终端或屏幕来接受控制台信息。同时,它可能拥有专门的打印终端设备。在现代工作站的Linux上,通常一个基于X上的有效的虚拟控制台将在屏幕上显示一个特别的控制台窗口。

  • /dev/tty
  • /dev/tty这个特别的文件是一个进程的控制终端(键盘,屏幕或者窗口)的一个替换入口(逻辑设备),如果该进程拥有的话。(例如由系统自动执行的进程和脚本就不会有控制终端,因此也就不能打开/dev/tty。)

    它被使用在下列情况下,/dev/tty允许一个程序直接向一个用户进行写操作,而不用关心用户正在使用伪终端或硬件终端。当标准输出被重定向时它是很有用的,比如通过命令ls -R | more以一组页面的方式来显示一个很长的目录,程序more不得不为输出的每个新页面提示用户。我们将在后面的章节具体了解/dev/tty。

    注:就一个/dev/console设备而言,可以有多个不同的物理设备通过/dev/tty来访问。
  • /dev/null
  • /dev/null是一个空设备,所有写到此设备的输出都将被丢弃。当此设备被读取时,将直接返回文件的终点,同时它还能在使用cp命令是被用来当作一个空文件的来源。通常不想要的输出都会重定向到/dev/null。(另一种创建空文件的方法是使用touch <filename>的方式,它会改变文件的修改日期或者所给文件名不存在时创建一个新的文件,不过它不会清空文件的内容。)

    $ echo do not want to see this > /dev/null
    $ cp /dev/null empty_file

    在/etc下还有其他的设备,包括硬盘和软盘、通信端口、磁带设备、CD-ROMs、声卡以及一些可以表现系统内部状态的设备。另外还有一个/dev/zero设备文件,它用零作为空字节的来源来填充所创建的文件。我们要想访问这些设备中一部分需要获得超级用户权限,普通用户所书写的程序不能直接访问像硬盘这样的低级设备。除此之外,系统与系统之间这些设备的名字可能有所不同。通常Linux发行版本里都会有以超级用户权限所运行的程序来管理那些用其他方式所不能访问的设备,例如,使用mount来挂载文件系统。

    设备分为字符设备和块设备,不过它们之间的区别所涉及到事实却是:访问有些设备时,每次都需要被访问设备的一个数据块。比较典型的例子,文件系统的一部分类型只有块设备才能够支持,比如硬盘。

    posted on 2008-04-01 17:15  taizi  阅读(299)  评论(0编辑  收藏  举报