当前位置:嗨网首页>书籍在线阅读

16-解除链接

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.3.3 解除链接

建立链接的反向操作是解除链接(unlinking),即从文件系统中删除路径名。只需要调用系统调用unlink(),就可以完成该任务:

382.png unlink()调用成功时,会从文件系统中删除pathname,并返回0。如果该路径是指向文件的最后一个链接,则会从文件系统中删除该文件。如果进程打开文件,在进程关闭文件前,内核不会从文件系统中删除文件。若没有进程打开该文件,文件会被删除。

如果pathname指向符号链接,则只会删除链接,而不会删除目标文件。

如果pathname指向的是特殊类型的文件(例如设备、FIFO或socket),调用会从文件系统删除该文件,但打开文件的进程可以继续使用它。

出错时,unlink()返回-1,并相应设置errno值为下列值之一:

EACCES 调用的进程没有对pathname父目录的写权限,或没有对pathname某部分的搜索权限。

EFAULT pathname指针非法。

EIO 发生内部I/O错误(这很严重!)。

EISDIR pathname指向一个目录。

ELOOP 解析pathname时遇到太多符号链接。

ENAMETOOLONG pathname太长。

ENOENT pathname组成不存在。

ENOMEM 剩余内存不足,无法完成请求。

ENOTDIR pathname的某部分不是目录。

EPERM 系统不允许解除链接。

EROFS pathname位于只读文件系统上。

unlink()不会删除目录。因此,应用程序应使用我们之前讨论(见8.2.3节)的rmdir()来删除目录。

为了简化对各种类型文件的删除,C语言提供函数remove():

383.png 成功调用remove()时,会从文件系统删除path,并返回0。如果path是个文件,remove()会调用unlink();如果path是个目录,remove()会调用rmdir()。

出错时,remove()返回-1,其errno可以是调用unlink()和rmdir()中出现的所有可能的错误码。