16-总结
18.15 总结
i-node 中并不包含文件的名称。相反,对文件的命名利用的是目录条目,而目录则是列出文件名和i-node 编号之间对应关系的一个表格。也将这些目录条目称作(硬)链接。一个文件可以有多个链接,这些链接之间的地位是平等的。可使用link()和unlink()来创建和移除链接,对文件的重命名则使用系统调用rename()。
调用symlink()可创建符号(或者软)链接。符号链接在某些方面与硬链接相类似,其差异则在于符号链接可以跨越文件系统边界,还可指代目录。符号链接只是一个内容包含了另一文件名称的文件,可通过readlink()来获取该文件的名称。(目标)i-node的链接计数中并未包含符号链接,如果将该链接所指向的文件移除,那么此链接将处于悬空状态。一些系统调用会自动对符号链接进行解引用(下溯),其余的则不会。有时系统会提供两种版本的系统调用,一种会解引用符号链接,另一种则不会,例如stat()和lstat()。
创建目录使用的是mkdir(),移除目录则使用rmdir()。而扫描一个目录的内容则可使用opendir()、readdir()以及相关函数。nftw()函数允许程序遍历一棵完整的目录树,并为树中每个文件调用由程序员定义的函数。
remove()函数可以用来移除一个文件(即一个链接)或者一个空目录。
每个进程都拥有一个根目录和一个当前工作目录,分别作为解释绝对路径和相对路径的参照点。可通过chroot()和chdir()系统调用来修改这些属性。而getcwd()函数则返回进程的当前工作目录。
Linux还提供了一套新的系统调用(如:openat()),其行为与其传统同行(如:open())相类似,不同之处则在于可利用新的系统调用来提供一个指向目录的文件描述符(而非进程的当前工作目录),用于作为解释相对路径名的参照点。这将有助于避免特定类型的竞态条件,以及为每个线程实现虚拟工作目录。
realpath()函数解析一个路径名——解引用所有的符号链接,并将所有的.和. .解析为相应目录——从而生成相应的绝对路径名。dirname()和basename()函数可用来将路径名分解为目录和文件名两部分。