文件
文件是指一组相关数据的有序集合。在linux系统中,文件中的数据与数据之间的关系是由使用文件的应用程序建立和解释的,他们就能在一个文件中有关系。
文件系统是指文件数据结构和管理文件的程序集合,除此之外,还包括ext2,ext3等分区格式和文件权限两个方面。
文件的属性
在linux中,每个文件都有其属性,包括文件类型、文件权限。
文件类型
文件根据处理方的来分,可以分为缓冲区文件和非缓冲区文件。
缓冲区文件:是指系统自动在内存区为每一个正在使用的文件开辟一个缓冲区。
非缓冲区文件:是指不自动开辟确定的缓冲区,由程序本身为每个文件设定缓冲区。
文件根据其数据的组织形式可以分为文本文件和二进制文件。
文本文件:ASCII文件,它的每一个字节存放一个ASCII代码,代表一个字符,一一对应,占用存储空间较多,使用需要花费时间转换为二进制形式。
二进制文件:把内存中的数据按照其所在内存中的储存形式原样输出到磁盘上存放,占用字符较少,不需要转换,但不是一一对应的,不能直接输出字符形式。
文件根据其存放数据的作用,可以分为普通文件、目录文件、链接文件、设备文件和管道文件。
普通文件:不包含文件系统的结构信息的文件,如图形文件、数据文件、文档文件、声音文件等。
目录文件:用于存放文件名及其相关信息的文件,是内核中用于组织文件系统的基本节点。
链接文件:一个真实存在的文件的链接,指向需要调用的文件。
设备文件:是Linux系统最特殊的一种文件。在Linux中,可以通过设备文件访问外部的硬件设备。
管道文件:用于不同进程间的信息传递。
文件权限
Linux采用了多用户的原则,不同的用户对不同的文件有不同的权限,有利于保护系统的安全。
权限分为3种,读r,写w,执行x
每个文件都对其具有所有权的用户,称为文件所有者。在Linux中,用户是以组为单元的,每个用户都存在于一个组或者同时属于多个组,因此对了对文件拥有所有权的用户外,还有文件所有者的同组用户和其他用户。以文件为中心的这3类用户对文件有不同的访问权限。
在Linux中,root是系统管理员,是一个拥有最高权限的用户。
文件的相关信息
在Linux中,每个文件都放在一个目录下,通过一个与文件按相关联的索引节点保存文件的一些属性信息(主要包括文件的目录结构、索引节点、文件中存放的数据)
文件的目录结构
系统的所有文件都存放在根目录root(/)下,目录文件就像一棵树,从根目录分出许多子目录,在子目录下又分出目录。
索引节点
这Linux中,索引节点所包含的信息被封装在stat结构体中
struct stat{
dev_t st_dev;//文件使用设备号
ino_t st_ino;//索引节点号
mode_t st_mode;//文件的访问权限
nlink_t st_nlink;//硬连接数
uid_t st_uid;//所有者用户ID
gid_t st_gid;//用户组ID
dev_t st_rdev;//设备文件的设备号
off_t st_size;//以字节为单位的文件大小
blksize_t st_blksize;//文件系统的磁盘块大小
blkcnt_t st_blocks;//当前文件的磁盘块大小
time_t st_atime;//最后一次访问该文件的时间
time_t st_mtime;//最后一次修改该文件的时间
time_t st_ctime;//最后一次改变文件状态的时间
};
文件中存放的数据
文件是由一组相关数据有续集而成。文件的相关数据存储在由索引节点指定的位置中,但有些特殊文件没有储存文件中的数据的硬盘区域(设备文件)。
文件的相关操作
在Linux中,文件的操作有很多种,比如文件的I/O操作、修改文件属性的操作、复制文件描述符的操作、对一些文件进行控制的相关操作等。在Linux中,对文件I/O操作有两种,分别是基于文件描述符的I/O操作,另一种是文件流的I/O操作。
修改文件属性
改变文件的所有者
系统提供了chown()和fchown()函数修改指定文件的所有者识别号和用户组识别号
#include<sys/types.h>
#include<unistd.h>
int chown(const char *pathname,uid_t owner,gid_t group);
int fchown(int fd,uid_t owner,gid_t group);
都用于修改文件的所有者识别号和用户组识别号。
chown()函数中参数pathname代表的是文件的绝对路径或相对路径。
fchown()函数中的参数fd表示文件的文件描述符。
owner参数是文件的新的所有者识别号。
group参数是指文件的新的用户组识别号
函数调用成功,返回0;失败,返回-1,并设置相应的errno值。
相比较,fchown()函数更安全些。
改变文件的访问权限
在Linux中,可以调用chmod()和fchmod()函数改变文件的访问权限。
#include<sys/types.h>
#include<sys/stat.h>
int chmod(const char *path,mode_t mode);
int fchmod(int fildes,mode_t mode);
path:需要修改文件的绝对路径或相对路径
fildes:需要修改文件的文件描述符
mode:文件将要修改的权限
函数调用成功,返回0;失败,返回-1,并设置相应的errno值。
改变文件的名称
提供了rename()函数修改文件的位置或文件的名字
#include<stdio.h>
int rename(const char *oldpath,const char *newpath);
函数调用成功,返回0;失败,返回-1,并设置相应的errno值。
例:
#include<stdio.h>
int main(int argc,char *argv[])
{
if(argc<3) /*从终端传递的参数小于3时,说明该程序的用法*/
{
printf("usages:%s oldpath newpath\n",argv[0]);
return 1;
}
if(rename(argv[1],argv[2])<0)/*调用函数将argv[1]的名字改为argv[2]的名字*/
{
printf("failed!\n");
return 1;
}
else
{/*函数调用成功*/
printf("%s=>%s\nsuccessful!\n",argv[1],argv[2]);
}
return 0;
}
改变文件的长度
提供了truncate()和ftruncate()函数
#include<unistd.h>
#include<sys/types.h>
int truncate(const char *path,off_t length);
int ftruncate(int fd,off_t length);
path为指向文件路径的指针
fd为文件的文件描述符
length为文件新的长度
多了就删,少了就加空字节(‘\0’)
ftruncate()函数要求文件以写的形式打开;truncate()函数要求文件必须是可写的。
函数调用成功,返回0;失败,返回-1,并设置相应的errno值。
复制文件描述符
提供了2个函数dup()和dup2()
#include<unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd);
复制一份参数oldfd表示的文件描述符,并将文件描述符返回。
复制出来的指向同一个文件,共享权限等。
函数调用成功,返回最小及尚未使用的文件描述符;失败,返回-1,并设置相应的errno值。
获取文件信息
系统提供了3个函数
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int stat(const char *path,struct stat *buf);
int fstat(int fd,struct stat *buf);
int lstat(const char *path,struct stat *buf);
path:需要获取信息的文件的路径名
fd:文件的描述符
buf: 指向一个stat结构体的指针
注:对stat()和lstat()函数需要获取处于某个目录下的文件信息,则要求对该文件所处的所有上级目录有执行的权限。
例:
使用stat()函数获取new.c文件的大小和该文件所有者的用户ID
#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
main()
{
struct stat buf;
stat("new.c",&buf); /*获取new.c文件信息,存放在buf中*/
printf("new.c file size=%d\n",buf.st_size);/*输出文件大小*/
printf("new.c file owner UID=%d\n",buf.st_uid);/*输出文件UID*/
}
文件的其他操作
将缓冲区数据写回磁盘
fsync()函数。将缓冲区数据写回磁盘
#include<unistd.h>
int fsync(int fd);
函数调用成功,返回0;失败返回-1并设置相应的errno值。
锁定文件
flock()函数。实现对文件做各种锁定和解除锁定的操作。
#include<sys/file.h>
int flock(int fd,int operation);
fd为操作的文件的文件描述符
operation为文件要做的各种锁定或者解除锁定的方式
operation取值:
- LOCK_SH:共享锁定,多个进程可同时对一个文件进行共享锁定。
- LOCK_EX:互斥锁顶。一个文件同时只能有一个互斥锁定。
- LOCK_UN:接触文件锁定状态。
- LOCK_NB:当无法建立锁定时,此操作不可被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX做或(|)运算。
单一的文件无法同时建立互斥锁顶和共享锁定,当使用dup()函数复制文件描述符,或者调用fork()函数创建子进程时,文件描述符不会继承这种锁定。
函数调用成功,返回0;失败返回-1并设置相应的errno值。