APUE读书笔记(5) 文件和目录(下)

第四章 文件和目录(下)

十一:函数chown、fchown、fchownat和lchown
  这几个函数都可用于更改文件的用户ID和组ID。原型如下:

#include <unistd.h>    
 
int chown(const char *pathname, uid_t owner, gid_t group);    
 
int fchown(int fd, uid_t owner, gid_t group);     
 
int fchownat(int fd, const char *pathname, uid_t owner, gid_t group, int flag);     
 
int lchown(const char *pathname, uid_t owner, gid_t group);     
 
4个函数的返回值:若成功,返回0;若出错,返回-1 

  其中需要注意几点:
  1. 当owner和group任意一个为-1的时候,不会有改动。
  2. 学了前面几章之后,我们很容易的摸索出来通过UNIX函数名来猜测他们的不同功能。
  3. 这里chown为基本函数;fchown是以文件描述符fd为传入参数;fchownat是根据flag参数不同可以设置绝对路径和相对路径。lchown在传入的文件路径所对应的文件时符号链接的情况下改变这个符号链接文件本身。
  4. fchownat函数有两种情况和lchown和fchown是相同的:flag为AT_FDCWD并且pathname为相对路径;pathname为绝对路径。这两种情况下,如果flag参数中清除了AT_SYMLINK_NOFOLLOW标志,则fchownat和chown行为相同,如果设置了这个参数,则和chown行为相同。
十二:文件长度
  stat结构成员st_size表示以字节为单位的文件的长度。但是这个字段你进队文件是普通文件、目录文件和符号链接文件的时候才有效。
  一般来说文件的长度无所谓,但是对于目录,其文件长度通常是16或者512的整数倍。
  对于符号链接文件,其文件长度是在文件名中的实际长度。
  du命令会报告文件的块数,一般单位可能是1024字节块,也可能是512字节块。这个却决于环境变量中,是否设置了参数POSIXLY_CORRECT。

有 POSIXLY_CORRECT ----> 1024
无 POSIXLY_CORRECT ----> 512

  如果文件中包含空洞,那么使用ls -l查看文件长度是会比文件实际的长度多,但是我们可以通过wc -c的方式来排除掉空洞的部分,得到文件的真实长度。
  值得注意的是,使用程序复制这个文件后,新的文件中的空洞会被0所填满。
十三:文件截断
  函数truncate和函数ftruncate可以截断文件。原型如下:

int truncate(const char *path, off_t length);
int ftruncate(int fd,off_t length);

十四:文件系统
  下图是UNIX文件系统的保存形式:
APUE读书笔记(5) 文件和目录(下)
  对于目录项的i结点来说,会有一个链接计数,这个值代表了指向这个结点的目录项数。只有当这个数降为0的时候,我们才可以删除该文件。这也就是为什么解除对一个文件的链接并不代表释放该文件占用的磁盘块的原因。所以删除目录项的函数叫unlink而不是叫delete。
  任何一个页目录的链接计数都是2,这是因为有该目录和该目录中的.项。
十五:函数link、linkat、unlink、unlinkat、remove
  link和linkat函数可以创建一个指向现有文件的链接。这两个函数没什么好介绍的。
  unlink和unlinkat是删除目录项,但是经过十四小节的学习我们一定知道这个“删除”的含义代表着该文件的链接计数减一。对于remove函数,如果接触文件,那么remove功能和unlink类似,如果解除目录,那么remove功能和rmdir类似。
十六:函数rename和renameat
  这两个函数的功能是为文件重命名。
十七:符号链接
  符号链接是对一个文件的间接指针。与硬链接不同,符号链接是为了避开硬链接的一些限制。
  硬链接通常要求链接和文件在同一个文件系统中,而且只有超级用户才能创建指向目录的硬链接。
  符号链接就没有上述的限制。但是在使用符号链接的时候需要注意当我们使用一个函数来处理符号链接的时候,应当知道这个函数可不可以跟随符号链接指向到文件。下面列出那些函数跟随符号链接,哪些不跟随。
APUE读书笔记(5) 文件和目录(下)
十八:创建和读取符号链接
  可以使用函数symlink和symlinkat函数创建一个符号链接。看到这种func和funcat的名字格式大家也都知道这两个函数该怎么用了,就不介绍了。
十九:文件的时间
  对于每个文件来说,它会维护三个时间字段

字段 说明 例子 ls(l)选项
st_atim 文件数据的最后访问时间 read -u
st_mtim 文件数据的最后修改时间 write 默认
st_ctim i节点状态的最后更改时间 chmod、chown -c

二十:函数futimens、utimensat、utimes
  前两个函数可以得到一个文件的访问和修改时间,最后一个函数可以设定文件的st_atim和at_mtim。需要注意,st_ctim时间不能修改,因为在调用utimes这个函数的时候这个值就已经被修改了。
二十一:函数mkdir、mkdirat和rmdir
  这几个函数是用来创建目录和删除目录的,同理,这种func和funcat形式的函数就不介绍了。

二十二:读目录
  对于一个目录,只要对于他有访问权限的用户都可以读取,但是对于写目录,只有内核才能写。
二十三:函数chdir、fchdir和getcwd
  每个进程都有一个当前工作目录。对于结对路径没有什么好说的,对于相对路径,是跟你就/etc/passwd中的用户工作目录开始的,一般用户工作目录为/usr/username。前两个函数可以更改当前工作目录。
  getcwd函数提供了找到当前目录的完整路径的功能。