APUE学习笔记之文件和目录

上一篇我们总结了执行I/O操作的基本函数,这一次我们主要学习文件系统的其他特征和文件的性质。

  1. 函数stat, fstat, fstatat和lstat
    如下4个stat函数以及它们的返回信息

    (1)一旦给出pathname,stat函数将返回与此命名文件有关的信息结构。
    (2)fstat函数获得已在文件描述符fd上打开文件的有关信息。
    (3)lstat函数类似于stat,但当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用的文件的信息。
    (4)fstatat函数为一个相对于当前打开目录(由fd参数指向)的路径名返回文件统计信息。
    (5)参数buf是一个指针,指向一个我们必须提供的结构(文件的权限等信息),使用stat函数最多的地方可能就是ls -l命令,用其可以获得有关文件的所有信息。
  2. 文件类型
    文件类型包括如下几种:
    (1)普通文件(regular file):这是最常用的文件类型,这种文件包含了某种形式的数据。
    (2)目录文件(directory file):这种文件包含了其他文件的名字以及指向这些文件有关信息的指针。
    (3)块特殊文件(block special file):这种类型的文件提供对设备(如磁盘)带缓冲访问,每次访问以固定长度为单位进行。
    (4)字符特殊文件(characher special file):这种类型的文件提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
    (5)FIFO:这种类型的文件用于进程间通信,有时也称为命名管道(named pipe)。
    (6)套接字(socket):这种类型的文件用于进程间的网络通信。套接字也可用于在一台宿主机上进程间的非网络通信。
    (7)符号链接(symbolic link):这种类型的文件指向另一个文件。
    文件类型信息包含在stat结构体的st_mode成员中(P76)。
  3. 设置用户ID和设置组ID
  4. 文件访问权限
    st_mode值也包含了对文件的访问权限位,每个文件有9个访问权限位,可将它们分成3类(P79)。
  5. 函数access和faccessat
    有时,进程也希望按其实际用户ID和实际组ID来测试其访问能力,access和faccessat函数是按实际用户ID和实际组ID进行访问权限测试的:

    (1)如果测试文件是否已经存在,mode就为F_OK,否则mode是下面所列常量的按位或:

    (2)faccessat函数与access函数在下面两种情况下是相同的:
    1)pathname参数为绝对路径。
    2)fd参数取值为AT_FDCWD而pathname参数为相对路径。
  6. 函数umask
    (1)umask函数为进程设置文件模式创建屏蔽字,并返回之前的值:

    (2)参数cmask是有前面提到的9个访问权限位常量(S_IRUSR, S_IWUSR等)中的若干个按位“或”构成的。
    (3)在进程创建一个新文件或目录时,就一定会使用文件模式创建屏蔽字。
  7. 函数chmod, fchmod, fchmodat
    这3个函数使我们可以更改现有文件的访问权限:

    (1)chmod函数在指定的文件上进行操作,而fchmod函数则对已打开的文件进行操作。
    (2)fchmodat函数与chmod函数在下面两种情况下是相同的:
    1)pathname参数为绝对路径。
    2)fd参数取值为AT_FDCWD而pathname参数为相对路径。
  8. 函数chown, fchown, fchownat和lchown
    这几个函数可用于更改文件的用户ID和组ID,如果两个参数owner或group中的任意一个是-1,则对应的ID不变:

    (1)除了所引用的文件是符号链接以外,这4个函数的操作类似。
    (2)在符号链接情况下,lchown和fchownat更改符号链接本身的所有者,而不是该符号链接所指向的文件的所有者。
  9. 文件截断
    有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截断为0是一个特例,在打开文件时使用O_TRUNC标志可以做到这一点。为了截断文件可以调用函数truncate和ftruncate:

    (1)这两个函数将现有文件长度截断为length,如果文件以前的长度大于length,则length以外的数据就不再访问。
    (2)如果以前的长度小于length,文件长度将增加(也就是可能在文件中创建了一个空洞)。
  10. 函数link, linkat, unlink, unlinkat, remove
    (1)任何一个文件可以有多个目录项指向其I节点。创建一个指向现有文件的链接的方法是使用link函数或linkat函数:

    (2)为了删除一个现有的目录项,可以调用unlink函数:

    (3)也可以用remove函数解除对一个文件或目录的链接。对于文件,remove的功能与unlink相同;对于目录,remove的功能与rmdir相同:
  11. 函数rename和renameat
    文件或目录可以用rename函数或者renameat函数进行重命名。
  12. 创建和读取符号链接
    (1)可以用symlink或symlinkat函数创建一个符号链接:

    (2)因为open函数跟随符号链接,所以需要有一种方法打开该链接本身,并读该链接中的名字。readlink和readlinkat函数提供了这种功能:

    两个函数组合了open, read, close的所有操作。
  13. 函数futimens, utimensat, utimes
    (1)一个文件的访问和修改时间可以用一下几个函数更改:
  14. 函数mkdir, mkdirat, rmdir
    (1)用mkdir和mkdir函数创建目录:

    这两个函数创建一个新的空目录。其中.和..目录项是自动创建的。所指定的文件访问权限mode由进程的文件模式创建屏蔽字修改。
    (2)用rmdir函数可以删除一个空目录。空目录是只包含.和..这两项的目录:
  15. 函数chdir, fchdir, getcwd
    (1)进程调用chdir或fchdir函数可以更改当前工作目录:

    这两个函数中,分别用pathname或打开万剑描述符来指定新的当前工作目录。
    (2)我们需要一个函数,它从当前工作目录(.)开始,用..找到其上一级目录,然后读其目录项…函数getcwd提供了这种功能:

     

发表评论

电子邮件地址不会被公开。 必填项已用*标注