




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文件和目录文件基本概念Linux文件结构ANSI标准文件函数POSIX标准文件函数目录基本操作一、文件基本概念Linux文件Linux系统中文件是一个广义的概念,不仅仅指一般意义上的文件。在一个Linux系统上能够出现的文件类型如下:普通文件(一般意义上的文件,数据的有序集合)管道(包括无名管道和有名管道)目录文件设备文件(字符设备和块设备)符号链接文件(类似快捷方式)套接口(网络设备文件)一、文件基本概念(1)普通文件-:也成为磁盘文件,是能够随即存取的数据存储单位,它是面向字节的,即从其中读出或写入的基本单位是字节,一个字节对应一个字符。(2)管道p:一个从一端接受数据并把数据传向另一端的
2、数据通道。Linux有两种类型的管道,有名管道和无名管道,管道是实现进程间通信的一种手段。(3)目录文件d:它是包含了保存在目录中文件列表的简单文件。(4)设备文件:该文件提供了到大多数物理设备的接口。Linux有两种类型的设备文件,字符设备c和块设备b。字符设备是指只能顺序访问且只能按字节读写的一类设备,如鼠标、调制解调器、打印机等;块设备是指能够随机存取且必须以一定大小的块来读写数据的设备,如磁盘驱动器、CD-ROM等。一般而言,字符设备用于传输数据,块设备用于存储数据。Linux的设备文件都保存在/dev目录下。(5)符号链接l:包含了到达另一个文件的路径的文件。(6)套接口s:让不同机
3、器的进程进行通信。一、文件基本概念一、文件基本概念文件模式文件模式是一个16比特位的域,说明了文件的类型和访问权限,各比特位含义如下图所示:访问权限文件有三种访问权限,分别为读、写和执行,每种权限有一个数字值与其对应,分别是4、2、1,设置权限时,每组权限通常用一个8进制数表示xxxxxxxrwxrwxrwx文件类型修饰位所有者权限所在组权限所有用户权限访问权限一、文件基本概念这个8进制数由各种权限值相加得到。例如,对某文件设置权限如下:文件属主有所有权限;文件属组有读和执行权限;所有用户只有读权限,则该文件的权限位为0754。修饰位它指出了文件是否设置了setUID位、setGID位和粘附位
4、,POSIX标准规定了一系列的宏来设置和修改文件的修饰位。更多信息请自行参阅其他参考文献。文件类型Linux的文件类型在3、4页面已有说明。二、Linux文件结构文件结构在Linux系统中,如何描述一个打开的文件呢?Linux内核定义了一个结构struct file来保存打开文件的基本信息,该结构定义在/usr/src/kernel/uname -r/include/linux/fs.h中。文件描述符对于用户空间来说,任何打开的文件都被分配一个非负整数,用于标识该文件,这个数值称为文件描述符。任何程序在运行时默认都会打开3个文件:标准输入文件0、标准输出文件1、标准错误输出文件2。其他文件描述
5、符从3开始。二、Linux文件结构在ANSI C中,这3个文件对应3个文件指针,分别是stdin、stdout和stderr。文件操作结构在POSIX标准中,对打开的文件的操作函数在文件/usr/src/kernel/uname -r/include/linux/fs.h中声明。该结构定义为struct file_operations,结构体中的每个成员指示打开文件相应操作函数的位置。这个结构体也是进行硬件驱动程序开发的一个重要组成部分。三、ANSI标准文件函数ANSI和POSIX标准的区别用户空间和内核空间出于保护系统安全的考虑,程序运行空间被分为用户空间和内核空间。一般情况下,程序运行在用
6、户空间,此时程序不能访问系统资源,比如内存地址、硬件设备等;当使用了系统调用时,程序进入内核空间运行,此时程序能够访问所有系统资源。ANSI标准库函数不属于系统调用,因此它运行在用户空间。实际上库函数的实现最终也要调用系统函数,但它封装了系统调用操作。三、ANSI标准文件函数文件流根据应用程序对文件的访问方式,即是否存在缓冲区,对文件的访问可分为带缓冲区的文件操作和非缓冲区文件操作。缓冲区文件操作:为文件读写开辟一定大小的缓冲区,当缓冲区满的时候,才执行一次读或写的操作。ANSI标准的I/O库使用的就是带缓冲区的文件操作。非缓冲区文件操作:无缓冲区,每次对文件的访问都需要执行一次系统调用。PO
7、SIX标准的I/O使用的就是非缓冲区文件操作。三、ANSI标准文件函数ANSI标准C库函数为实现缓冲区特性,采用了流的概念,因为数据在缓冲区内的输入输出就像物质的流动,在流的实现中,缓冲区是最重要的单元。根据使用需求的不同,具体有全缓冲、行缓冲和无缓冲3种处理方式。全缓冲:这种缓冲区默认大小为8192字节,在缓冲区满或者显式调用刷新函数后才进行I/O系统调用操作。对于普通文件通常采用全缓冲方式访问。行缓冲:默认行缓冲区大小为128字节,当遇到换行符或者缓冲区满时,执行I/O系统调用。终端即行缓冲访问方式。三、ANSI标准文件函数无缓冲:在每次进行文件访问时,都要进行I/O系统调用。标准错误输出
8、流就是不带缓冲区的,以使出错信息能够尽快显示出来。文件流指针ANSI提供了一个名称为FILE的结构体,包含了与文件有关的所有信息(如实现I/O的文件描述符、执行流缓冲区的指针、缓冲区的大小、当前在缓冲区的字符数和出错标志等)。当使用库函数打开一个文件时,将返回一个该结构体类型的指针和文件关联,称为文件流指针,所有针对该文件的读写操作都可以通过该文件流指针完成。三、ANSI标准文件函数ANSI标准文件I/O函数打开文件函数-fopenFILE *fopen(const char *path,const char *mode);该函数有两个参数:第一个是要打开的文件的路径和文件名,如果文件和程序在
9、同一目录下,可省略路径;第二个参数指定文件的打开方式。modes说明r/rb以只读的方式打开文件,该文件必须已经存在r+/rb+以可读写的方式打开文件,此文件必须存在w/wb以只写的方式打开文件,若该文件存在则清空,不存在就创建它w+/wb+以可读写的方式打开文件,若该文件存在则清空,不存在就创建它a/ab追加方式,文件存在则数据追加到文件后面,不存在则创建a+/ab+可读写追加方式,文件存在则在它的尾部读写数据,不存在则创建如果执行成功,返回打开文件的文件指针,失败则返回NULL(空指针)。关闭文件-fcloseint fclose(FILE *_stream);该函数在关闭某流对象之前,将
10、缓冲区中的数据回写到磁盘文件中(这一操作由系统完成),如果程序没有显式调用fclose函数,但正常退出,回写操作仍然正确执行。如果执行成功,函数返回0,否则返回EOF,并设置错误标识位error全局变量。三、ANSI标准文件函数三、ANSI标准文件函数单字符读写读:int fgetc(FILE *stream);写:int fputc(char ch,FILE *stream);以上两个函数功能是从/向指定的流读/写一个字符,执行成功返回读写的字符数。字符串读写读:char *fgets(char *str,int n,FILE *stream);从指定的流中读取n个字符放入缓冲区str中,如
11、果读不到字符串时返回NULL。写:int fputs(char *str,FILE *stream);将缓冲区中的字符串写入指定流。数据块读写读:int fread(void *buffer,int size,int count,FILE *stream);功能:从stream指定的流中一次读入size个字节,共读取count次,并将独到的数据写入到buffer指定的缓冲区中。函数执行成功返回实际读到的字节数,失败返回-1。写:int fwrite(void *buffer,int size,int count,FILE *stream);功能:从buffer指向的缓冲区开始,一次输出三、AN
12、SI标准文件函数三、ANSI标准文件函数size个字节,重复count次,将输出的数据存入stream指定的文件流中,同时将文件位置指针后移size*count字节。刷新缓冲区-fflushint fflush(FILE *stream);功能:将缓冲区中未所有未写的数据立即写入到stream指定的文件流。文件位置指针定位-fseekint fseek(FILE *stream,long offset,int whence);将文件流读写位置指针以whence为基准移动offset字节。whence取值为0-文件头;1-当前位置;2-文件尾。三、ANSI标准文件函数标准文件操作举例从键盘上输入
13、一个班30个学生的数据并保存到磁盘文件中,再从中读取第4个学生的信息显示到屏幕上。该例程文件名为f_stu.c。四、POSIX标准文件函数基本系统调用打开文件-open#include#include#includeint open(const char *path,int flags);int open(const char *path,int flags,mode_t mode);参数说明path指明文件所在路径;flag参数定义文件的打开方式,有三种基本打开方式,由预定义的宏设置:O_RDONLY只读;O_WRONLY只写;O_RDWR读写。四、POSIX标准文件函数open调用还可以在
14、flag参数中包括下列可选模式的组合(用“按位或”操作)标志说明O_CREAT如果文件不存在则创建文件O_EXCL仅与O_CREAT连用,如果文件存在,强制open失败O_NOCTTY如果文件是一个终端,就不会成为打开进程的控制终端O_TRUNC如果文件存在,则将文件的长度截至0O_APPEND把写入数据追加在文件末尾O_NONBLOCK非阻塞方式,如果读操作没有blocking则无法完成时,读操作返回0字节四、POSIX标准文件函数当使用带O_CREAT标志的open创建文件时,必须设置第三个参数mode定义文件的权限,可以使用权限位的八进制方式设置,也可以使用预定义的宏设置,预定义权限宏参
15、考相关资料。权限位的设置还受到权限掩码的限制,关于权限掩码这里不再深入讨论。返回值如果open调用成功,则返回打开文件的文件描述符,失败时返回-1并设置全局变量errno以指明失败的原因。四、POSIX标准文件函数关闭文件-close#includeint close(int fd);参数说明fd是要关闭文件的文件描述符。返回值调用成功返回0,失败返回-1。读文件-read#includesize_t read(int fd,void *buf,size_t nbytes);功能描述四、POSIX标准文件函数从fd指定的文件中读取nbytes个字节存入buf指定的内存缓冲区中,size_t实际
16、是一个无符号整数类型。返回值如果调用成功,则返回实际读到的字节数,它可能小于请求的字节数;未读到数据则返回0;失败返回-1。写文件-write#includesize_t write(int fd,const void *buf,size_t nbytes);功能描述四、POSIX标准文件函数从buf指定的数据区读取nbytes个字节写入文件fd中。返回值如果调用成功,返回实际写入的字节数,它可能小于nbytes,这并不一定是个错误,还需要检查errno以发现错误;返回0表示未写任何数据,失败返回-1。文件读写实例本例实现的是将一个文件的内容复制到另一个文件中,分别使用了单字符拷贝方式和块拷贝
17、方式比较两种方式的不同,文件分别为program目录中的cp_char.c和cp_block.c。四、POSIX标准文件函数编译并使用下面的命令查看程序运行时间,比较两种拷贝方式的不同:四、POSIX标准文件函数其他与文件管理有关的系统调用文件指针定位-lseek#include#includeoff_t lseek(int fd,off_t offset,int whence);功能描述将文件读写指针定位到某一个指定位置。参数说明off_t实际是一个长整型。offset是相对应whence的偏移量; fd是要操作的文件描述符;whence由下面的宏定义:四、POSIX标准文件函数SEEK_S
18、ET:文件头SEEK_CUR:文件当前指针SEEK_END:文件尾返回值lseek返回从文件头到文件指针被设置处的字节偏移量,失败时返回-1。读取文件状态信息-fstat、stat、lstat#include#include#includeint fstat(int fd,struct stat *buf);int stat(const char *path,struct stat *buf);int lstat(const char *path,struct stat *buf);四、POSIX标准文件函数功能描述读取指定文件的文件信息,该信息被保存在stat结构体中。相关的函数stat和l
19、stat返回的是通过文件名查到的状态信息,它们的结果基本一致,但当文件是一个符号链接时,lstat返回的是符号链接本身的信息,而stat返回的该链接指向的文件的信息。参数说明path是指定文件的路径和文件名;stat结构体用于保存文件信息,该结构体在不同的UNIX系统上会有所不同,但一般会包括如下内容:四、POSIX标准文件函数strct statdev_t st_dev;/保存文件的设备ino_t st_ino;/与该文件关联的inodemode_t st_mode;/文件权限和文件类型信息nlink_t st_nlink;/硬链接的数量uid_t st_uid;/文件属主的UID号gid_
20、t st_gid;/文件属主的GID号dev_t st_rdev;/设备类型,如果是设备文件off_t st_size;/文件大小,以字节为单位unsinged long st_blksize;/文件系统I/O的块大小unsigned long st_block;/文件分配的块数量time_t st_atime;/文件最后的访问时间time_t st_mtime;/文件内容最后修改时间time_t st_ctime;/文件权限、属主、组最后修改时间;四、POSIX标准文件函数为了确定Linux文件类型,在头文件sys/stat.h中定义了一系列宏用于测试文件类型,如下所示:S_ILINK:符号
21、链接文件S_ISREG:普通文件S_ISDIR:目录文件S_ISCHR:字符设备文件S_ISBLK:块设备文件S_ISFIFO:有名管道文件S_ISSOCK:套接口文件fstat应用实例读取给定输入文件信息并按格式要求打印,文件名为file_stat.c。四、POSIX标准文件函数同步写入硬盘-fsync#includeint fsync(int fd);功能描述将所有已写入文件描述符fd的数据真正地写到磁盘或其他下层设备上。Linux文件系统可以使数据在写入磁盘前先在内存中保留几秒钟,以此更高效地处理磁盘I/O。返回值如果调用成功fsync返回0,否则返回-1并设置全局变量errno。四、P
22、OSIX标准文件函数复制文件描述符-dup和dup2#includeint dup(int fd);int dup2(int fd1,int fd2);功能描述dup和dup2系统调用提供了复制文件描述符的一种方法,使我们能够通过两个或者更多个不同的描述符访问同一个文件,这可以用于在文件的不同位置对数据进行读写。dup系统调用复制文件描述符fd,并返回一个新的文件描述符;dup2通过明确指定目标描述符来把一个文件描述符复制为另外一个。四、POSIX标准文件函数高级文件系统调用文件控制-fcntl#includeint fcntl(int fd,int cmd);int fcntl(int fd
23、,int cmd,long arg);int fcntl(int fd,int cmd,struct flock *lock);功能描述利用fcntl系统调用,可以对打开的文件描述符执行各种操作,包括对它们进行复制、获取和设置文件描述符标志、获取和设置文件状态标志以及管理文件锁等。对不同操作的选择是通过选取命令参数cmd不同的值来实现的,其取值定义在fcntl.h中。根据所选择命令的不同,可能还需要第三个参数arg。cmd取值列表如下页所示:这里主要讨论fcntl调用实现文件锁的功能。文件锁文件上锁是为了能够让多个进程安全、合理并按照预料同时访问同一文件的方法。程序经常需要共享数据,这通常是由
24、文件实现的。但多个进程同时访问一个文件会带来预想不到的麻烦,试想如果两个进程同时对一个文件写入的后果吧。四、POSIX标准文件函数四、POSIX标准文件函数命令说明F_DUPFD复制文件描述符fdF_GETFD获得fd的close-on-exec标志。如果标志没有设置,则文件经过exec系列调用之后仍然保持打开状态F_SETFD设置close-on-exec标志以便在arg中传递值F_GETFL得到open设置的标志F_SETFL改变open设置的标志F_GETLK获取文件锁信息F_SETLK设置文件锁,不等待F_SETLKW设置文件锁,在需要时,等待F_GETOWN检索将收到SIGIO和SI
25、GURG信号的进程ID或进程组号F_SETOWN设置进程ID或进程组号四、POSIX标准文件函数文件锁有两种类型:建议性锁和强制性锁。建议性锁也称为合作性锁,它依赖于这样的约定,每个使用上锁文件的进程都要检查是否有锁存在,并尊重已有的锁。内核和系统总体上都坚持不用建议性锁,它们依靠程序员去遵守该约定;强制性锁是由内核所执行的,当一个文件被上锁以进行写入操作时,在锁定该文件的进程释放该锁之前,内核会阻止任何对该文件的读或写访问。采用强制性锁对性能影响很大,因为每个read或write操作都必须检查是否有锁存在。fcntl调用能够施加建议性和强制性两种锁。四、POSIX标准文件函数fcntl还能够
26、用于建立记录锁,记录锁是对文件的一部分而不是整个文件的锁,这种上锁行为更为细致的控制使得进程能够更好地协作以共享文件资源。fcntl还可以用于设置读取锁和写入锁。读取锁也称为共享锁,因为多个进程能够在文件的同一部分上建立读取锁;写入锁经常被称为排斥锁,因为任何时刻只能有一个进程在文件的某个部分上建立写入锁,其他进程就不能在相同的部分再建立写入锁了。四、POSIX标准文件函数Linux在/kernels/asm-generic/fcntl.h头文件中定义了一个锁结构用于对文件进行加、解锁处理,该结构如下所示:struct flock shortl_type;shortl_whence;_kern
27、el_off_tl_start;_kernel_off_tl_len;_kernel_pid_tl_pid;_ARCH_FLOCK_PAD;四、POSIX标准文件函数说明:l_type指定锁的类型,有三种取值。F_RDLCK为读取锁;F_UNLCK为解锁;F_WRLCK为写入锁。l_whence定义文件指针的绝对位置,取值为:SEEK_SET文件头;SEEK_CUR当前位置;SEEK_END文件尾。l_start定义锁区域相对于l_whence的开始偏移量l_len定义锁区域的字节数。l_pid定义持有锁的进程的进程号。文件中的每个字节在任一时刻只能拥有一种锁。四、POSIX标准文件函数fcn
28、tl的返回值无论设置或清除锁,如果操作成功,fcntl都返回0;如果不能设置锁,则返回-1,并且设置errno的值为EACCES或EAGAIN。在对文件设置锁之前,需使用F_GETLK检查锁的状态。如果另一个进程已经设置了锁,则会在flock *结构中填满相关的信息;否则,lock的成员l_type将被设置为F_UNLCK,以表明没有设置任何锁。当对文件中的区域加锁之后,访问文件中的数据应该使用底层的read和write调用。四、POSIX标准文件函数程序实例一-lockit.c为了方便,lockit定义了函数setlock来处理锁操作。while循环的目的是为了连续尝试设置锁,直至成功。如果
29、第一次调用就成功了,那么它会立即返回main函数,否则,执行第二个if代码块找出无法设置锁的原因。setlock函数的末尾调用getchar的是能够让你一步一步执行程序。编译程序后,在两个终端窗口中分别运行lockit程序,同时对同一个文件执行锁操作,你将会看到程序执行的效果。四、POSIX标准文件函数程序实例二-lock.c、lock_test.c实例二演示文件锁是如何工作的,为了实验锁定,需要两个程序:程序lock用于锁定文件区域;程序lock_test进行测试。实验解析程序首先创建一个测试文件test_file,并以读写的方式打开它,然后在文件中写入100个字符A接着在文件上设置两个区域
30、:第一个区域为1030字节,使用共享锁;第二个区域为4050字节使用独占锁。然后调用fcntl锁定这两个区域,并在关闭文件和退出程序前等待一分钟。四、POSIX标准文件函数测试程序lock_test把文件中的每5个字节分成一组,为每组设置一个区域结构来测试锁,然后通过使用这些结构来查看对应区域示范可以被加写锁或读锁。返回信息显示造成锁请求失败的区域字节数和从0开始的偏移量。结果中可以看到1030字节上可以设置一个共享锁,而在4050字节上,两种锁都将失败。程序执行$./lock &/后台执行lock程序$./lock_test四、POSIX标准文件函数程序运行结果(部分)四、POSIX标准文件
31、函数同时读写多个文件-select#includeint select(int n,fd_set *readfds,fd_set *writefds,fd_set exceptfds,struct timeval *timeout);功能描述select调用启用了I/O多路转接功能,这意味着能够同时从多个文件描述符读取数据或者向多个文件描述符写入数据。Select调用是非资源密集型的,它需要等待一定数量的文件描述符来改变状态。参数说明四、POSIX标准文件函数n包含了在任何受监视集合中最高编号的文件描述符再加1;readfds是用于读的文件描述符集,如果用户只对写入文件感兴趣,可以给该参数传递
32、NULL;writefds用于写入的文件描述符集;exceptfds用于异常的文件描述符集;timeout决定了在I/O操作发生前select将会阻塞多久。如果timeout为0,表示非阻塞,select调用会立即返回;如果为NULL,表示阻塞调用,直到有I/O操作发生或发生错误,select调用才返回原进程。返回值select调用成功返回0,失败返回-1并设置errno变量的值。与select调用有关的宏FD_ZERO(fd_set *set);/清除集合setFD_SET(int fd,fd_set *set);/把描述符fd添加到setFD_CLR(int fd,fd_set *set)
33、;/从set中清除fdFD_ISSET(int fd,fd_set *set);/判断fd是否在set中四、POSIX标准文件函数五、目录基本操作创建与删除目录创建目录-mkdir#includeint mkdir(const char *path,mode_t mode);mkdir系统调用的作用是创建目录,path包含目录的路径和目录名,mode定义目录权限。删除目录-rmdir#includeint rmdir(const char *path);rmdir系统调用的作用是删除一个空目录,path指明目录的路径和目录名。五、目录基本操作更改目录和获取工作目录切换目录-chdir#includeint chdir(const char *path);获取当前工作目录-getcwd#includechar *getcwd(char *buf,size_t size);getcwd把当前目录的名字写到给定的缓冲区buf中,如果目录的名字超出了参数size给出的缓冲区长度,它就
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度金属加工工厂转让简易协议
- 2025年度股权回购协议作废及资产清算协议
- 2025年度金融科技入股协议书
- 二零二五年度代理记账业务合作协议免责条款
- 2025年度智能机器人技术研发与聘用专家劳务合同
- 2025年度试用期员工用工合同集合
- 二零二五年度无子女再婚配偶共同财产及子女抚养权保障合同
- 珠宝认购合同范本
- 二零二五工伤私了赔偿协议范本新标准
- 二零二五年度合肥市劳动合同(含员工社会责任履行)
- 经典文学作品中的女性形象研究外文文献翻译2016年
- 控股集团公司组织架构图.docx
- 高炉煤气安全知识的培训
- 2008 年全国高校俄语专业四级水平测试试卷
- 需求供给与均衡价格PPT课件
- 最常用2000个英语单词_(全部标有注释)字母排序
- 人造革的几种生产制造方法
- 在银行大零售业务工作会议上的讲话讲解学习
- 古代传说中的艺术形象-
- 水电站大坝土建安装工程悬臂模板施工手册
- 三体系内审检查表(共58页).doc
评论
0/150
提交评论