linux文件系统的操作
1、对于linux系统,文件系统指的是某个格式化后用于存储文件的设备(如硬盘、软盘,或CD-ROM),文件系统可以再很多允许随机访问的存储介质上建立(磁带只允许顺序访问,所以不能包含一个文件系统)。
linux中的文件系统类型有:二级扩展文件系统,或extsfs,用于存储linux文件;MS-DOS文件系统,允许linux访问MS-DOS分区和软盘上的文件;其他文件系统,包括CD-ROM使用的ISO9660文件系统。
2、文件系统是在磁盘上存储数据所采用的部分机制,每个磁盘划分为多个分区,每个分区的大小由系统管理员根据需要决定,文件系统存在于分区中,每个文件系统里又包含目录,每个目录里又包含子目录和文件等。
3、文件系统的结构也就是文件的组织方式。
inode结构包含了有关文件的信息,有些系统的inode最多包含40多条信息,大部分供内核使用,与用户相关的信息有:mode(文件的权限和类型)、link count(包含本inode项的目录个数)、user ID(文件所有者的用户ID)、group ID(文件所有者所在组的ID)、size(文件的大小字节数)、access time(上次文件被访问的时间)、mod time(上次文件被修改的时间)、block list(包含文件第一段的磁盘块号的列表)、indirect list(包含文件除第一段外的磁盘块号的列表)。
注意其中并不包括文件名和节点号,文件名信息存放在目录文件中。
超级块中记录了inode表、空闲块表等重要信息在磁盘上的存放位置,超级块很重要,回复严重瘫痪的文件系统可能要对超级块进行操作。超级块中保存的信息主要有:一是文件系统的大小以及所有未被使用块的大小;二是库用数据库的数量和部分可以及时分配的空闲数据块列表;三是最近一次更新时间与文件系统的状态;四是空闲inode结点的个数和部分可以及时 使用的inode结点列表。
4、文件的分类:文件类型记录在stat结构的st_mode域中。
(1)正规文件:普通文件,分为文本文件,和二进制文件。
(2)目录文件:只有内核才能写目录文件,inode和磁盘块是一一对应的,但多个目录项可以对应一个inode。
(3)硬链接文件:指向一个inode,系统吧硬链接文件看成另外一个文件,一个文件有几个硬链接就备份几次,硬链接文件共享inode,不能跨文件系统存在,ln命令产生硬链接文件,ls-il命令列出文件硬链接以及inode信息。为目录创建硬链接时可能使整个文件系统瘫痪,硬链接中,inode不能只想一个目录。
(4)符号链接文件:并不指向一个inode,而是指向一个文件,可以跨文件系统存在,可以用命令ln-s产生。
(5)套接字文件:一般在linux系统与其他机器联网时使用,用在网络端口上,文件系统利用套接进行进程间的通讯。文件权限之前的字母为s。
(6)有名管道文件:用于进程间通信,mkmod可以创建,文件权限之前的字母为p
(7)字符设备文件:存放在/dev目录中,提供一种与设备驱动程序通讯的方法,通信量为一个字符,文件权限之前的字母为c
(8)块设别文件:存放在/dev目录中,用于同驱动程序进行通讯,一次传递一个数据,文件权限之前的字母为b。硬盘是块设备,而终端是字符设备。
5、顺序文件操作,普通文件即为顺序文件
(1)打开文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
第三个参数(...)仅当创建新文件时才使用,用于指定文件的访问权限。pathname 是待打开/创建文件的路径名;oflag 用于指定文件的打开/创建模式。
成功则返回文件描述符,是一个非常小的非负整数,实际是一个指向打开文件描述的指针数组的一个索引,否则返回 -1。由open 返回的文件描述符一定是该进程尚未使用的最小描述符。只要有一个权限被禁止则返回-1。
flags参数必须使用以下三个中的一个,它们三个是互斥的:
O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式
以下常量是选用的:
O_APPEND 每次写操作都写入文件的末尾
O_CREAT 如果指定文件不存在,则创建这个文件
O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设 置为非阻塞模式(nonblocking mode)。
mode参数常用的三个有用组合为:
S_IRWXU(S_IRUSR | S_IWUSR | S_IXUSR)文件所有者读写执行权限
S_IRWXG(S_IRGRP | S_IWGRP |S_IXGRP)文件用户组读写执行权限
S_IRWXO(S_IROTH | S_IWOTH | S_IXOTH)文件其他用户读写执行权限
(2)创建新文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int create(const char* pathname,mode_t mode);调用正确返回文件描述符
和下列函数等价
open(pathname, O_WRONLY | O_CREATE | O_TRUNC,mode);
(3)读文件
#indlude <unistd.h>
ssize_t read(int fd,void *buf,size_t nbytes);正确返回0或字节数;
(4)写文件
#indlude <unistd.h>
ssize_t write(int fd,const void *buf,size_t nbytes);正确返回0或字节数;
(5)关闭文件
#indlude <unistd.h>
int close(int fd);
(6)用户缓冲区
使用缓冲技术的文件I/O软件包(fopen(),fclose()等)
6、随机文件操作
顺序访问,所有的读写都从文件的当前偏移位置开始。
随机文件操作时将当前文件偏移值改变到有关的位置,强迫下一次读或写操作发生在指定的位置(除非文件被O_APPEND打开)。
#include<sys/types.h>
#include<fcntl.h>
off_t lseek(int fd,off_t offset,int whence);
参数offset是一个相对值,参数whence取下列值之一:
SEEK_SET:从文件开始处计算偏移
SEEK_CUR:从文件当前位置计算偏移
SEEK_END:从文件借书处计算偏移
7、文件共享
内核使用三种数据结构,它们之间的关系决定了一个进程对另一个和它共享文件的进程的运行效果。
文件描述符仅用于单个进程的单个描述符,而文件状态标志用于指向给定文件打开表项的任何进程的所有描述符。
一个存在的文件描述符可以利用以下的函数来复制:
#include <unistd.h>
int dup(int fd);返回可用的文件描述符中最小的一个数字
int dup2(int fd,int fd2);用fd2定义新的文件描述符,若fd2已存在,则它首先被关闭。
新复制的文件描述符和原来的文件描述符共享一个打开文件表项,它们的文件状态标志(读写和链接等)使用相同的文件地址。
8、索引节点
linux中所有的文件和设别都有一个索引节点(inode即index node)与之相连,通过索引节点来访问它们。索引节点包含的关于文件的信息,这些信息为了可供进程使用都被拷贝到stat结构中(sys/stat.h头文件),stat结构体主要域有:
9、文件层次结构
(1)linux进程可以利用mkdir()系统调用创建一个目录
#include <sys/types.h>
#include<sys/stat.h>
int mkdir(const char *pathname ,mode_t mode);
创建的新目录将为调用进程的有效用户识别号所拥有,并且它将自动被初始化成包含点和点点项目。每个目录下,都有一个名称为“.”的文件来代表目录本身,有一个名称为“..”的文件代表本目录的父目录。
(2)进程还可以删除空的目录,访问目录以及对目录进行读和关闭。
10、改变文件属性
(1)改变文件名称
int rename(const char * oldname,const char* newname);
(2)改变文件读取权限
int chmod(char *pathname,mode_t mode);
int fchmod(int fd,mode_t mode);
(3)改变文件的所有者(只有root账号可以使用)
int fchown(int fd,uid_t owner,gid_t group);
int chown(const char *pathname,uid_t owner,gid_t group);