你会使用 unlink 删除文件吗?

本文介绍Linux系统中unlink命令的使用方法,该命令可用于删除文件和链接,包括软链接和硬链接。文章对比了unlink与rm命令之间的差异,帮助读者理解何时更适合使用unlink。
导读在 Linux 中删除文件,我们通常使用 rm 命令。除此以外,还有另外一个命令,可以用于删除文件和链接,这就是 unlink 命令。虽然它听起来像是只能删除 Linux 系统中的链接,但实际上,也可以删除文件。


在 Linux 中删除文件,我们通常使用 rm 命令。除此以外,还有另外一个命令,可以用于删除文件和链接,这就是 unlink 命令。虽然它听起来像是只能删除 Linux 系统中的链接,但实际上,也可以删除文件。

Linux 系统中删除文件的过程是非常迅速的,只是一瞬间。当你删除文件时,Linux 内核发现它对应于索引节点编号 X,系统会将其从目录列表中删除文件条目,并将索引节点 X 的链接计数减少1,这时候,索引节点 X 的链接计数为0,内核会认为没有人链接到此索引节点,所以就可以安全的删除索引节点,并删除与其关联的数据块。

现在我们来看一下如何使用 unlink 命令。

unlink 命令

如前文所述,unlink 命令用于删除文件和链接,其中链接包括软链接和硬链接。它是最简单的命令之一,除了 --help 以及 --version 以外,没有任何其他选项。

使用 unlink 删除文件,可以这样:

unlink filename

删除链接,可以这样使用:

unlink link_name

删除成功后,不会有任何输出:

这就是 unlink 命令的功能,除此以外不做任何其他事情。

unlink 不能同时删除多个文件和链接

rm 命令可以一次删除多个文件。但是 unlink 却不能,它一次只能删除一个文件或者链接,而且,也不能使用全局模式(globbing patterns)。

如果我们尝试给定多个文件的话,它会抛出一个错误,执行失败:

[gliu@fedora ~]$ unlink *.txt
unlink: extra operand ‘file2.txt’
Try 'unlink --help' for more information.

同时删除多个链接也会如此。

使用 unlink 不能删除目录

GNU 实现下的 unlink 命令是无法删除目录的,如果给定的文件名称是一个目录,就会报错:

[gliu@fedora ~]$ unlink new_dir
unlink: cannot unlink 'new_dir': Is a directory

rm 和 unlink 的区别

unlink 命令使用 unlink 系统命令,而 rm 命令使用 unlinkat 系统调用,两个系统调用几乎相同。但是这两个命令之间还是有一些明显的差异。

如前文所述,unlink 命令在同一时间只能删除一个文件或链接,而 rm 命令可以删除多个;unlink 命令不能删除目录,而 rm 命令能删除目录。

rm 命令在执行的时候,首先会安全检查,如果你没有文件的写权限,那么系统会要求你给出写权限(sudo或者切换至管理员用户),或者使用强制删除选项 -f;而 unlink 则不会进行安全检查,直接删除文件。


另外,与 rm 不同,unlink 没有其他选项。

在某些情况下,相比于 rm,你可能更喜欢使用 unlink。比如你希望强制删除一个文件,而不考虑安全或者权限问题;或者如果删除失败(比如文件不存在)的话你希望能看到报错信息,这种情况下就可以使用 unlink。因为使用 rm -f 强制删除文件,如果文件不存在的话,不会显示任何错误信息。

https://www.linuxprobe.com/?p=252849

<think>我们正在讨论C语言中的unlink函数。用户询问“unlink是会删除文件是吗”,这是一个关于unlink函数功能的问题。 回答:是的,unlink函数用于删除文件系统中的文件。但需要注意以下几点: 1. unlink删除的是文件的目录项(dentry),并减少其inode的链接计数。只有当链接计数为0且没有进程打开该文件时,文件占用的磁盘空间才会被释放。 2. 如果文件正在被进程打开(比如还有文件描述符指向它),则文件内容不会立即删除,直到所有打开该文件的进程关闭文件后,系统才会真正释放空间。 3. 对于临时文件,通常创建后立即unlink,这样即使程序崩溃,文件也会在关闭后自动删除。 因此,在之前的代码中,使用unlink(temp_path)是为了删除临时文件,防止残留。 接下来,根据规则,在回答后必须提出3-5个相关问题,以“§§相关问题§§”开头,且禁止换行分散。 考虑到用户的问题是关于unlink的,我们可以提出以下相关问题: 1. unlink函数在删除文件时,如果文件正在被其他进程打开,会产生什么影响? 2. 在多线程环境中使用unlink是否安全?需要额外的同步措施吗? 3. 除了unlink,还有哪些方法可以确保临时文件在程序异常退出时被自动清理? 4. unlink能否用于删除目录?如果不能,应该使用什么函数? 注意:问题数量在3-5个。 </think>是的,`unlink()` 函数在 Linux/Unix 系统中用于删除文件。以下是关键说明: ### `unlink()` 的核心行为 1. **文件删除** `unlink(temp_path)` 会立即删除文件系统中指定的文件(`/tmp/mtd_win.bin`) 2. **空间释放** 文件占用的磁盘空间会被标记为可重用(实际释放时机取决于文件系统) 3. **打开文件处理** -文件已被进程打开(如前面代码中的 `fd`) - `unlink()` 会使文件名从目录中消失 - 但已打开的文件描述符仍可继续读写 - 直到最后一个持有文件描述符的进程关闭文件后,空间才真正释放 ### 在您代码中的正确用法 ```c unlink(temp_path); // 直接调用即可删除文件 ``` ✅ **正确特性**: - 无论文件是否打开都可调用 - 对符号链接会删除链接本身(非目标文件- 执行后立即生效,无需额外操作 ⚠️ **注意事项**: 1. **权限要求** 需要对该文件的父目录有写权限(`/tmp` 通常所有用户可写) 2. **目录限制** 无法直接删除非空目录(需用 `rmdir` 或递归删除) 3. **错误处理** 建议检查返回值: ```c if (unlink(temp_path) == -1) { perror("Failed to delete temp file"); } ``` ### 与相关函数的区别 | 函数 | 作用 | 适用对象 | |-------------|--------------------------|---------------| | `unlink()` | 删除文件/符号链接 | 文件 | | `remove()` | 标准库封装(同unlink) | 文件 | | `rmdir()` | 删除空目录 | 目录 | | `shm_unlink`| 删除共享内存对象 | 共享内存 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值