《LinuxC从入门到精通》.明日科技.第09章.文件操作_第1页
《LinuxC从入门到精通》.明日科技.第09章.文件操作_第2页
《LinuxC从入门到精通》.明日科技.第09章.文件操作_第3页
《LinuxC从入门到精通》.明日科技.第09章.文件操作_第4页
《LinuxC从入门到精通》.明日科技.第09章.文件操作_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文件初探本讲大纲:文件文件与与文件系文件系统统的的概概念念文件的文件的属属性性文件的相文件的相关关信息信息文件与文件系统的概念 所谓文件是指一组相关数据的有序集合。在所谓文件是指一组相关数据的有序集合。在LinuxLinux系统系统中,文件中的数据与数据之间的关系,是由使用文件的应用中,文件中的数据与数据之间的关系,是由使用文件的应用程序建立和解释的。他们仅在一个文件中有关系。程序建立和解释的。他们仅在一个文件中有关系。 而文件系统是指文件数据结构和管理文件的程序集合,而文件系统是指文件数据结构和管理文件的程序集合,除此之外,还包括除此之外,还包括ext2ext2、ext3ext3等分区格式和

2、某个具体的目录等分区格式和某个具体的目录。文件的属性在Linux系统中文件是很重要也很复杂的。每一个文件都存在其特有的属性,包括文件类型和文件权限两个方面。1.文件类型文件可以根据其处理方法的不同,分为缓冲区文件和非缓冲区文件。所谓缓冲区文件是指系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。而非缓冲区文件是指不自动的开辟确定大小的缓冲区,而由程序本身为每个文件设定缓冲区。从内存向磁盘输出数据时,必须先送到内存中的缓冲区,待装满缓冲区后,再将数据一起送到磁盘。文件还可以根据其数据的组织形式的不同,分为文本文件和二进制文件。在Linux系统中,把文件看作是一个字符序列,即由一个个字符的数

3、据顺序组成的文本文件和二进制文件。文本文件又称之为ASCII文件,它的每一个字节存放一个ASCII代码,代表一个字符,都是一一对应的,因而,此文件便于对字符进行逐个处理,也便于输出字符,但是占用的存储空间比较多。而且要花费ASCII码与二进制形式间的转换时间。二进制文件是把内存中的数据按其所在内存中的存储形式原样输出到磁盘上存放,占用字节比较少,并且不需要转换,但是一个字节并不对应一个字符,不能直接输出字符形式。文件可以根据其存放数据的作用的不同,将其分为普通文件、目录文件、链接文件、设备文件和管道文件。普通文件:它是在Linux系统中比较常遇见的一类文件,如图形文件、数据文件、文档文件、声音

4、文件等等。在Linux系统中,所谓的普通文件就是不包含有文件系统的结构信息的文件。目录文件:在Linux系统中,目录文件是较特殊的一种文件,用于存放文件名及其相关信息的文件,是内核中用于组织文件系统的基本结点。链接文件:所谓的链接文件其实就是一个真实存在的文件的链接,当需要使用某个文件时,可以创建一个链接文件,指向需要调用的文件。设备文件:设备文件是Linux系统中最为特殊的一种文件,在Linux系统中,可以通过设备文件访问外部的硬件设备,这样用户就可以像访问普通文件一样去访问外部设备。在Linux系统中,设备文件通常都放在/dev目录下。管道文件:在前面的多进程通信中,已经提及到管道文件这个

5、词,这中文件主要用于不同进程间的信息传递。管道的一端用于写入数据,另一端用于读取数据,管道采用的是先进先出的原则。2.文件权限与Linux系统打交道这么久后,印象最深的应该就是它的多用户特点。由于Linux系统是内核源码开放的一种系统,那么当用户不小心删除或者修改了系统的重要文件后,就会给系统引起瘫痪的危险。因此Linux系统采用了多用户的原则,对于不同的用户访问同一个文件设定了不同的权限,这样更有利于保护系统的安全。对于Linux系统中的文件来说,权限分为3种:读的权限(r)、写的权限(w)和执行的权限(x)。每个文件都有对其具有所有权的用户,通常称之为文件所有者。在Linux系统中,用户都

6、是以组为单元的,每一个用户都存在一个组或者同时属于多个组中。因此除了对文件拥有所有权的用户之外,还有文件所有者的同组用户和其他用户。以文件为中心的这三类用户对文件有着不同的访问权限。文件的相关信息在Linux系统中,每一个文件都是存放在一个目录下,通过一个与文件相关联的索引节点保存文件的一些属性信息。与文件相关的信息主要包括文件的目录结构、索引节点和文件中存放的数据。1.文件的目录结构系统中的所有文件都存放在根目录root(/)下,所谓的目录文件就像一棵大树,从根目录中又会分支出很多子目录,在子目录下又会分出很多下一级目录或者普通文件。系统中的每个目录都处于一定的目录结构中,在这个目录结构中含

7、有所有的目录项的列表,每一个目录项都是由这个目录的名称和索引节点构成,开发人员可以通过这个目录文件的名称访问该目录项下的内容,然后通过索引节点可以获取该文件自身的一些属性信息。2.索引节点(inode)在前面多次提及通过文件的索引节点可以获取这个文件自身的一些信息,在Linux系统中,将这些索引节点所包含的信息封装在stat这个结构体中。stat结构体的定义形式如下:struct statdev_t st_dev;/*文件使用的设备号*/ino_t st_ino;/*索引节点号*/mode_t st_mode;/*文件的访问权限*/nlink_t st_nlink;/*硬连接数*/uid_t

8、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系统的终端下通过输入命令“man 2 stat”,可以查看关于系

9、统调用函数stat的相关信息,在这里定义了结构体stat中存放的信息,效果如图9.1所示。标题文件的相关操作本讲大纲:修改文件修改文件属属性性复复制文件描述符制文件描述符获获取文件信息取文件信息文件的其他操作文件的其他操作修改文件属性在Linux系统中,文件的操作有很多种,如文件的I/O操作,修改文件属性的操作,赋值文件描述符的操作,以及一些对文件进行控制的相关操作等。在Linux系统中,文件的I/O操作有两种操作模式,一种是基于文件描述符的I/O操作,另一种是基于文件流的I/O操作。在本章中不对文件的I/O操作进行介绍,在下一章中,对这部分内容进行详细的讲解。9.2.1 修改文件属性文件的属

10、性是很复杂的,并不仅是前面介绍的文件的类型和文件的权限,还包括文件的长度、所处的位置等等信息。在使用文件时,有时候需要改变文件的某些属性,因此系统提供了系统调用函数满足这一要求。1.改变文件的所有者系统提供了函数chown()和函数fchown()修改指定文件的所有者识别号和用户组识别号,系统调用函数的定义形式如下:#include#includeInt chown(const char *pathname,uid_t owner,gid_t group);Int fchown(int fd,uid_t owner,gid_t group);这两个系统调用函数都是用于修改文件的所有者识别号和用

11、户组识别号。其中函数chown()中参数pathname代表的是文件的绝对路径或相对路径;函数fchown()中的参数fd表示文件的文件描述符,通过这两个参数就指定了需要操作的文件。而参数owner代表的是该文件的新的所有者识别号;参数group代表的是指定文件的新的用户组识别号。两个函数调用成功时,返回值为0;调用失败时,返回值为-1,并设置相应的errno值。?技巧:介绍的上述两个函数实现的功能是相同的,但是两个函数指定文件的方法不同,一个是通过指定的文件所在路径,另一个是指定文件的文件描述符,两者相比较而言,系统调用函数fchown()更加安全一些。在Linux系统中,每个文件对于其所有

12、者和所在的用户组,都有特定的文件访问权限,如只读的权限,或者只写的权限,或者执行的权限。当将文件的所有者和所在的用户组进行修改后,其权限就会受到影响,因此,Linux系统的普通用户,只能对自己拥有所有权的文件的用户组识别号进行修改,并且只能在其所属的组之中进行选择。&说明:在Linux系统中,root用户作为操作系统的最高级别的用户,它可以调用这两个函数对任意的文件进行修改。2.改变文件的访问权限在Linux系统中,可以通过调用函数chmod()和函数fchmod()改变文件的访问权限。文件的访问权限就是前面介绍过的读的权限、写的权限和执行的权限。这两个函数实现的功能是相同的,它们的关

13、系与前面介绍的chown()函数和fchown()函数的关系是相同的。函数chmod()和函数fchmoe()的定义形式如下:#include复制文件描述符在在LinuxLinux系统中提供了两个函数系统中提供了两个函数dup()dup()和和dup2()dup2()用于复制文件的描述符。用于复制文件的描述符。这两个函数的定义形式如下:这两个函数的定义形式如下:#include#includeInt dup(int oldfd);Int dup(int oldfd);Int dup2(int oldfd,int newfd);Int dup2(int oldfd,int newfd);这两个函

14、数主要实现了复制一份参数这两个函数主要实现了复制一份参数oldfdoldfd表示的文件描述符,并将文件描述符返回表示的文件描述符,并将文件描述符返回。复制出来的文件描述符与原来的文件描述符指的是同一个文件,共享所有的锁定、复制出来的文件描述符与原来的文件描述符指的是同一个文件,共享所有的锁定、读写位置和各项权限或旗标。读写位置和各项权限或旗标。如果函数调用成功,返回值为最小及尚未使用的文件描述符;否则返回值为如果函数调用成功,返回值为最小及尚未使用的文件描述符;否则返回值为-1-1,并,并设置适当的设置适当的errnoerrno值。值。dupdup返回的新文件描述符是该进程未使用的最小文件描述

15、符。返回的新文件描述符是该进程未使用的最小文件描述符。dup2dup2可以用可以用newfdnewfd参参数指定新描述符的数值。如果数指定新描述符的数值。如果newfdnewfd当前已经打开,则先将其关闭再做当前已经打开,则先将其关闭再做dup2dup2操作,操作,如果如果oldfdoldfd等于等于newfdnewfd,则,则dup2dup2直接返回直接返回newfdnewfd而不用先关闭而不用先关闭newfdnewfd再复制。再复制。获取文件信息在Linux系统中提供了3个系统调用函数,用于获取文件的信息。这3个函数的定义形式如下:#include#include#includeInt s

16、tat(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结构体类型的指针。上述3个函数主要是通过指针或者文件描述符所指定的文件进行相关信息的获取,然后将获取到的信息写入到参数buf中。在调用系统调用函数获取文件信息时,即使对该文件没有读取的权限,也可以获取到该文件的信息。U注意:对于stat()函数和lst

17、at()函数,如果需要获取处于某个目录下的文件信息,则要求对该文件所处的所有上级目录有执行的权限。?技巧:在Linux系统的终端下,可以通过输入命令“man 2 stat”得到关于获取文件信息的三个函数的详细讲解,并且还介绍了关于buf指针所指向的stat结构体的定义形式和成员变量的取值情况。例9.2 在Linux系统中,使用stat()函数获取new.c文件的大小和该文件所有者的用户ID值。(实例位置:光盘TMsl92)程序的代码如下:#include#include#includemain()struct stat buf;stat(new.c,&buf);/*获取new.c文件信

18、息,存放在buf中*/printf(new.c file size=%dn,buf.st_size);/*输出文件大小*/printf(new.c file owner UID=%dn,buf.st_uid);/*输出文件UID*/文件的其他操作在Linux系统中还提供了很多关于文件的系统调用函数,例如将缓冲区数据写回磁盘、锁定文件或解除文件的锁定等等操作。1.将缓冲区数据写回磁盘系统调用函数fsync()实现了将缓冲区数据写回磁盘中。该函数的定义形式如下:#includeInt fsync(int fd);参数fd指的是文件的文件描述符。函数fsync()主要将参数fd所指的文件中的数据,由

19、缓冲区写回磁盘,以确保数据同步。该函数调用成功时,返回值为0;否则,返回值为-1,并设置适当的errno错误代码。2.锁定文件系统调用函数flock()主要实现了对文件作各种锁定或解除锁定的动作。该函数的定义形式如下:#includeInt flock(int fd,int operation);参数fd表示用于操作的文件的文件描述符;参数operation表示对文件做的各种锁定或者解除锁定的操作方式。参数operation有如下4种取值情况:LOCK_SH:建立共享锁定。多个进程可同时对同一个文件进行共享锁定。LOCK_EX:建立互斥锁定。一个文件同时只有一个互斥锁定。LOCK_UN:解除文

20、件锁定状态。LOCK_NB:当无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX作或(|)运算。?技巧:在单一的文件无法同时建立共享锁定和互斥锁定,当使用了dup()函数复制了文件描述符,或者调用fork()函数创建了子进程时,文件描述符不会继承此种锁定。该函数调用成功时,返回值为0;否则返回值为-1,并设置适当的errno值。标题特殊文件的操作本讲大纲:目目录录文件的操作文件的操作链链接文件的操作接文件的操作设备设备文件文件目录文件的操作目录文件是比较特殊的一种文件,用于存放文件名及其相关信息的文件,是内核中用于组织文件系统的基本结点。Linux系统从空间上

21、来开,都是由文件组成的,每一部分内容都存放到一个指定的文件中。目录文件就像一棵大树,从根处可以分支成许多叉,而Linux系统中的所有文件都存放在根目录下,以“”表示。对于目录文件有如下几种常见的操作。1.获取当前的工作目录在Linux系统中提供了一个系统调用函数getcwd(),用于获取当前的工作目录。每一个进程都有一个当前的工作目录这个概念,当前的工作目录就是一个路径名的解析。?技巧:在终端下,可以通过输入命令“man 3 getcwd”获取这个系统调用函数的详细信息。函数getcwd()的定义形式如下:#includechar *getcwd(char *buf,size_t size);

22、参数buf用于存储当前工作目录的字符串;参数size用于存放字符串的大小。函数如果调用成功,返回指向当前工作目录字符串的指针,否则返回NULL,并设置适当的errno值。例9.3 使用getcwd()函数获取当前进程的工作目录。(实例位置:光盘TMsl93)程序代码如下:#include#include#includeint main()char aPATH_MAX;/*存放工作目录的字符串*/if(getcwd(a,PATH_MAX)=NULL)/*获取当前工作目录*/perror(getcwd failed!);return 1;printf(输出当前工作目录:%sn,a);/*输出字符数

23、组*/return 0;链接文件的操作在Linux系统中链接文件是一个特殊的文件,类似于Windows系统中的快捷方式,可以快速定位不同目录下文件的方法。系统中存在两种链接文件,一种是硬链接,另一种是符号链接,接下来对这两类链接文件进行介绍。1.硬链接硬链接是依附于索引节点而存在的,在Linux系统中,使用硬链接,需要注意如下几点:(1)目录无法创建硬链接,只有文件才可以创建硬链接。(2)硬链接不能够跨越文件系统,即不能为处在不同分区上的文件创建硬链接。在Linux系统的终端下,可以通过ln命令创建一个文件的硬链接。链接文件相当于原文件的一个快捷方式,两个文件的索引节点值是一致的,当删除原文件

24、时,硬链接文件依然指向原来的索引节点值,即索引节点没有被删除,因此想要删除文件的数据,需要将文件以及所有的硬链接一同删除。在Linux系统中提供了相关的系统调用函数创建一个新的硬链接和解除一个硬链接。创建硬链接函数link()系统调用函数link()的定义形式如下:#includeint link(const char *oldpath,const char *newpath);函数link()主要用于为一个已经存在的文件创建一个新的硬链接。参数oldpath代表已经存在的文件,参数newpath代表创建的新的硬链接的文件名。这两个文件路径需要在一个文件系统中。如果newpath文件已经存在,则不会在这个文件中写入数据。该函数如果调用成功,返回值为0;否则返回值为-1,并设置相应的errno信息。删除硬链接函数unlink()系统调用函数unlink()的定义形式如下:#includeInt unlink(const char *pathname);函数unlink()主要用于删除一个已经存在的硬链接文件。参数pathname指向的就是这个存在的硬链接文件的路径名称。例9.4 通过系统调用函数link()为已经存在的文件old.c创建了一个硬链接,名称为hardlink.c,并打开这个硬链接文件,打开10秒后,再通过unlink

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论