Linux文件结构
Linux环境中的文件为操作系统服务和设备提供了一个简单而一致的接口。在Linux中,一切都是文件。
目录
文件,除了本省包含的内容以外,它还会有一个名字和一些属性,即“管理信息”,包括文件的创建/修改日期和它的访问权限。这些属性被保存在文件的inode(节点)中,它是文件系统中的一个特殊的数据块,它同时还包含文件的长度和文件在磁盘上的存放位置。系统使用的是文件的inode编号。
目录是用于保存其他文件的节点号和名字的文件。目录文件中的每个数据项都是指向某个文件节点的链接,删除文件名就等于删除与之对应的链接(文件的节点号可以通过ln -i命令查看)。
删除一个文件时,实质上是删除了该文件对应的目录项,同时指向该文件的链接数减1.该文件中的数据可能仍然能够通过其他指向同一文件的链接访问到。如果指向某个文件的链接数变为0,就表示该节点以及其指向的数据不再使用,磁盘上的相应位置就会被标记为可用空间。
文件和设备
硬件设备在Linux中通常也被表示(映射)为文件。
- 3个比较重要的设备文件
-
/dev/console
这个设备代表的是系统控制台。错误信息和诊断信息通常会被发送到这个设备。在现代的工作站和Linux上,它通常是“活跃”的虚拟控制台;而在X视窗系统中,它会是屏幕上一个特殊的控制台窗口。
-
/dev/tty
如果一个进程有控制终端的话,那么特殊文件/dev/tty就是i这个控制终端(键盘和显示屏,或键盘和窗口)的别名(逻辑设备)。有系统自动运行的进程和脚本就没有控制终端,所以它们不能打开/dev/tty.
在能够使用该设备文件的情况下,/dev/tty允许程序直接向用户输出信息,而不管用户具体使用的是哪种类型的伪终端或硬件终端。
虽然/dev/console设备只有一个,但通过/dev/tty却能够访问许多不同的物理设备。
-
/dev/null
/dev/null文件时空(null)设备。所有写向这个设备的输出都将被丢弃,而读这个设备会立刻返回要给文件尾标志。常把不需要的输出重定向到/dev/null。
底层文件访问
每个运行中的程序被称为进程(process),它有一些与之关联的文件描述符。这是一些小值整数,你可以同故宫它们访问打开的 文件或设备。
write系统调用
系统嗲用write的作用是把缓冲区buf的前n bytes个字节写入与文件描述符fildes关联的文件中,它返回实际写入的字节数。如果文件描述符有错或者底层的设备驱动程序对数据块长度比较敏感,该返回值可能会小于n bytes.如果这个函数返回0,就表示未写入任何数据;如果它返回的是-1,就表示在write调用中出现了错误,错误代码保存在全局变量errno里。
#include<unistd.h>
size_t write(int fildes,const void *buf,size_t nbytes);
read系统调用
系统调用read的作用是:从与文件描述符fildes相关联的文件里读入n bytes个字节的数据,并把它们放到数据区buf中,他返回实际读入的字节数,这可能会小于请求的字节数。如果read调用返回0,就表示未读入任何数据,已经到了文件尾。如果返回的是-1,表示read调用出现了错误。
#include<unistd.h>
size_t read(int fildes,void *buf,size_t nbytes);
open系统调用
创建一个新文件描述符
#include<fcntl.h>
#include<sys/types.h>//在遵循POSIX规范的系统上,使用open调用并不需要包括sys/types.h和sys/stat.h
#include<sys/stat.h>//但在某些UNIX系统上,它们可能是必不可少的
int open(const char *path,int oflags);
int open(const char *path,int oflags,mode_t mode);
path:准备打开的文件或设备的名字作为参数path传递给函数,oflags参数用于指定打开文件所采取的动作。
oflags参数是通过必需文件访问模式与其他可选模式相结合的方式来指定的。其下必须指定其一
<