正如前面所述,这是U N I X文件系统的经典格式,在B a c h〔1 9 8 6〕一书的第4章中对此作了
说明。关于伯克利快速文件系统对此所作的更改请参阅 L e ffler 等〔1 9 8 9〕中的第7章。
4.15 link,unlink,remove和r e n a m e函数
如上节所述,任何一个文件可以有多个目录项指向其 i节点。创建一个向现存文件连接的
方法是使用l i n k函数。
#include
int link(const char *e x i s t i n g p a t h, const char *n e w p a t h) ;
返回:若成功则为0,若出错则为-1
此函数创建一个新目录项n e w p a t h,它引用现存文件e x i s t i n g p a t h。如若n e w p a t h已经存在,则返
回出错。
创建新目录项以及增加连接计数应当是个原子操作(请回忆在3.11节中对原子操作的讨论)。
大多数实现,例如S V R 4和4 . 3+B S D要求这两个路径名在同一个文件系统中。
P O S I X . 1允许支持跨越文件系统的连接的实现。
只有超级用户进程可以创建指向一个目录的新连接。其理由是这样做可能在文件系统中形
成循环,大多数处理文件系统的公用程序都不能处理这种情况( 4 . 1 6节将说明一个由符号连接
引入的循环的例子)。
为了删除一个现存的目录项,可以调用u n l i n k函数。
#include
int unlink(const char *p a t h n a m e) ;
返回:若成功则为0,若出错则为-1
此函数删除目录项,并将由p a t h n a m e所引用的文件的连接计数减1。如果该文件还有其他连接,
则仍可通过其他连接存取该文件的数据。如果出错,则不对该文件作任何更改。
我们在前面已经提及,为了解除对文件的连接,必须对包含该目录项的目录具有写和执行
许可权。正如4 . 1 0节所述,如果对该目录设置了粘住位,则对该目录必须具有写许可权,并且
具备下面三个条件之一:
• 拥有该文件。
• 拥有该目录。
• 具有超级用户优先权。
第 4章 文件和目录 7 1
下载
1