linux内核unlink和rename,对目录项的操作 -- link、unlink、remove、rename

1. link

任何一个文件可以有多个目录项指向其i节点,创建一个指向现有文件的链接的方法是使用link函数:

int link (const char * existingpath, const char * newpath);

定义与unistd.h中,调用成功返回0,否则返回-1

次函数创建一个新目录项newpath,它引用现有的文件existingpath,如若newpath已存在,则返回-1,而newpath路径中除最后一级目录的其它部分都应已经存在,否则出错返回-1

大多数实现都要求这两个路径名在同一个文件系统中,如果实现允许创建指向一个目录的硬链接,也必须是超级用户才可以这样做,因为这样可能会造成文件系统的循环,大多数应用程序不能处理这样的情况

2. unlink

删除一个目录项可以调用unlink函数

int unlink( const char * pathname );

定义于unistd.h,若调用成功返回0,否则返回-1

删除目录项并将所引用文件的链接计数减1。如果还有指向该文件的其他链接,则仍可通过其他链接访问该文件的数据

如果调用出错将返回-1,并且不会对文件造成任何更改

为了解除文件的链接,必须对包含该目录项的目录具有写和执行的权限。

当执行unlink函数时,内核首先检查打开该文件的进程数,如果该数打到0,然后检查其链接数,如果也是0,那么就删除文件

也就是说,当进程打开一个文件以后,对文件调用unlink,文件并不会立即删除,只有当文件被进程关闭或是进程终止的情况下,文件才会从磁盘上删除

如果这个文件是符号链接,unlink只会删除这个链接而不是这个链接所指向的文件,没有一个函数可以通过符号链接删除其指定的文件

只有超级用户可以使用unlink删除目录文件,但是通常应当使用rmdir函数而不是unlink

3. remove

删除文件,对于文件,unlink的功能与remove相同

int remove( const char *filename);

定义于stdio.h,若调用成功返回0,否则返回-1

4. rename

更换文件名

int rename(char *oldname, char *newname);

定义于stdio.h,若调用成功返回0,否则返回-1

注意的几点:

1。如果oldname不是目录,那么为该文件或符号链接更名,如果newname已存在并且不是目录,则先删除newname对应的文件,如果newname已存在并且是一个目录,则出错返回-1

2。如果oldname是一个目录,则为这个目录更名,如果newname是存在的目录且为空,则先删除newname对应的目录,如果newname是存在的目录且不为空,则出错返回-1

3。如果oldname和newname相同,则不做任何处理,调用成功返回0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值