【APUE笔记】第四章 文件和目录

1.stat、fstat 和lstat 函数

  功能:给定一个pathname,stat函数返回一个与此命名文件有关的信息结构,fstat函数获得已在描述符filedes上打开的文件的有关信息。lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。

2.文件类型

(1)普通文件(regular file)-> S_ISREG()
(2)目录文件(directory file) -> S_ISDIR()
  对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件。
(3)字符特殊文件(character special file)-> S_ISCHR()
(4)块特殊文件(block special file) -> S_ISBLK()
  此类型典型用于磁盘设备。
(5)FIFO -> S_ISFIFO()
  用于进程间通信,也称管道。
(6)套接口(socket)-> S_ISSOCK()
  用于进程间的网络通信。也可用于在一台宿主机上的进程之间的非网络通信。
(7)符号连接(symbolic link) -> S_ISLNK()

3.access 函数

  功能:按实际用户ID和实际组ID进行存取许可权测试。
access函数的mode参数:
R_OK测试读许可权
W_OK测试写许可权
X_OK测试执行许可权
F_OK测试文件是否存在

4.umask 函数

  功能:umask函数为进程设置文件方式创建屏蔽字,并返回以前的值。
例:umask(0) 即权限为0777

5.chmod和fchmod 函数

  功能:更改现存文件的存取许可权。chmod函数在指定的文件(第一个参数为路径)上进行操作,而fchmod函数则对已打开的文件(第一个参数为文件描述符)进行操作。
S_ISUID 执行时设置-用户-ID
S_ISGID 执行时设置-组-ID
S_ISVTX 保存正文

S_IRWXU 用户(所有者)读、写和执行
  S_IRUSR 用户(所有者)读
  S_IWUSR 用户(所有者)写
  S_IXUSR 用户(所有者)执行

S_IRWXG 组读、写和执行
  S_IRGRP 组读
  S_IWGRP 组写
  S_IXGRP 组执行

S_IRWXO 其他读、写和执行
  S_IROTH 其他读
  S_IWOTH 其他写
  S_IXOTH 其他执行

6.chown, fchown和lchown函数

  功能:chown和fchown函数更改文件的用户ID和组ID。在符号连接情况下,lchown更改符号连接本身的所有者,而不是该符号连接所指向的文件。

7.link,unlink,remove和rename函数

link: 创建一个文件连接。
unlink: 文件连接计数减1,如果减为0相当于删除该文件。
  只有当连接计数达到0时,该文件的内容才可被删除。只要有进程打开了该文件,其内容就不能删除。关闭一个文件时,内核首先检查使该文件打开的进程计数。如果该计数达到0,然后内核检查其连接计数,如果这也是0,那么就删除该文件的内容。unlink的这种特性经常被程序用来确保即使是在程序崩溃时,它所创建的临时文件也不会遗留下来。进程用open或creat创建一个文件,然后立即调用unlink。因为该文件仍旧是打开的,所以不会将其内容删除。只有当进程关闭该文件或终止时(在这种情况下,内核关闭该进程所打开的全部文件),该文件的内容才被删除。
remove: 解除对一个文件或目录的连接。对于文件,remove的功能与unlink相同。对于目录,remove的功能与rmdir相同。
rename: 根据oldname是指文件还是目录,有两种情况要加以说明。我们也应说明如果 newname已经存在将会发生什么。
(1) 如果oldname说明一个文件而不是目录,那么为该文件更名。在这种情况下,如果newname已存在,则它不能引用一个目录。如果 newname已存在,而且不是一个目录,则先将该目录项删除然后将oldname更名为newname。对包含oldname的目录以及包含newname的目录,调用进程必须具有写许可权,因为将更改这两个目录。
(2) 如若oldname说明一个目录,那么为该目录更名。如果 newname已存在,则它必须引用一个目录,而且该目录应当是空目录(空目录指的是该目录中只有 . 和… 项)。如果newname存在(而且是一个空目录),则先将其删除,然后将oldname更名为newname。另外,当为一个目录更名时,newname 不能包含 oldname 作为其路径前缀。例如,不能将/usr/foo更名为/usr/foo/testdir,因为老名字(/usr/foo)是新名字的路径前缀,因而不能将其删除。
(3) 作为一个特例,如果oldname和newname引用同一文件,则函数不做任何更改而成功返回。
  如若newname已经存在,则调用进程需要对其有写许可权(如同删除情况一样)。另外,调用进程将删除oldname目录项,并可能要创建newname目录项,所以它需要对包含oldname及包含newna
me的目录具有写和执行许可权。

8.symlink和readlink函数

symlink功能:创建一个符号连接。

#include <unistd.h>
int symlink(const char *actualpath, const char * sympath) ;
返回:若成功则为0,若出错则为-1

  该函数创建了一个指向actualpath的新目录项sympath,在创建此符号连接时,并不要求actualpath已经存在(在上一节结束部分的例子中我们已经看到了这一点)。并且,actualpath和sympath并不需要位于同一文件系统中。
readlink功能:因为open函数跟随符号连接,所以需要有一种方法打开该连接本身,并读该连接中的名字。readlink函数提供了这种功能。

#include <unistd.h>
int readlink(const char *pathname, char *buf, int bufsize);
返回:若成功则为读的字节数,若出错则为-1

  此函数组合了open, read和close的所有操作。如果此函数成功,则它返回读入buf的字节数。在buf中返回的符号连接的内容不以null字符终止。

9.utime函数

  功能:一个文件的存取和修改时间可以用utime函数更改。

10.mkdir和rmdir函数

  功能:用mkdir函数创建目录,用rmdir函数删除目录。

11.chdir, fchdir和getcwd函数

  功能:在前两个函数中,可以分别用pathname或打开文件描述符来指定新的当前工作目录。
getcwd函数:从当前工作目录开始,找到其上一级的目录,然后读其目录项,直到该目录项中的i节点编号数与工作目录i节点编号数相同,这样地就找到了其对应的文件

12.sync和fsync函数

  传统的UNIX实现在内核中设有缓冲存储器,大多数磁盘I / O都通过缓存进行。当将数据写到文件上时,通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓存以便存放其他磁盘块数据时,再将该缓存排入输出队列,然后待其到达队首时,才进行实际的I / O操作。这种输出方式被称之为延迟写(delayed write)。延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓存中内容的一致性,UNIX系统提供了sync和fsync两个系统调用函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值