unlink系统调用及示例

  1. unlink - 删除文件或硬链接

函数介绍

unlink系统调用用于删除文件或硬链接。当文件的所有硬链接都被删除且没有进程打开该文件时,文件数据才会被真正删除。

函数原型

1
2
3
4
#include <unistd.h>

int unlink(const char *pathname);

功能

删除指定路径的文件或硬链接。

参数

  • const char *pathname: 要删除的文件路径

返回值

  • 成功时返回0

  • 失败时返回-1,并设置errno

特殊限制

  • 只能删除文件,不能删除目录(使用rmdir)

  • 如果文件正被进程打开,文件数据不会立即删除

相似函数

  • rmdir(): 删除空目录

  • remove(): 删除文件或空目录

  • unlinkat(): 相对路径版本

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>

int main() {
int fd;
struct stat st;

printf("=== Unlink函数示例 ===\n");

// 示例1: 基本文件删除
printf("示例1: 基本文件删除\n");

// 创建测试文件
fd = open("test_unlink.txt", O_CREAT | O_WRONLY, 0644);
if (fd != -1) {
write(fd, "Test content for unlink", 23);
close(fd);
printf("创建测试文件\n");
}

// 删除文件
if (unlink("test_unlink.txt") == -1) {
perror("删除文件失败");
} else {
printf("成功删除文件\n");

// 验证文件已删除
if (access("test_unlink.txt", F_OK) == -1) {
printf("文件确实已删除\n");
}
}

// 示例2: 硬链接删除演示
printf("示例2: 硬链接删除演示\n");

// 创建文件和硬链接
fd = open("multi_link.txt", O_CREAT | O_WRONLY, 0644);
if (fd != -1) {
write(fd, "Content with multiple links", 27);
close(fd);
}

if (link("multi_link.txt", "second_link.txt") == 0) {
printf("创建硬链接\n");

// 检查链接数
if (stat("multi_link.txt", &st) == 0) {
printf("当前链接数: %ld\n", st.st_nlink);
}

// 删除一个链接
if (unlink("second_link.txt") == 0) {
printf("删除一个链接\n");

if (stat("multi_link.txt", &st) == 0) {
printf("剩余链接数: %ld\n", st.st_nlink);
printf("文件数据仍然存在\n");
}
}
}

// 示例3: 文件被打开时的删除
printf("示例3: 文件被打开时的删除\n");

fd = open("open_file.txt", O_CREAT | O_WRONLY, 0644);
if (fd != -1) {
write(fd, "Content of open file", 20);
printf("创建并打开文件\n");

// 删除已打开的文件
if (unlink("open_file.txt") == 0) {
printf("删除已打开的文件(文件仍可访问)\n");

// 仍可以读写文件
lseek(fd, 0, SEEK_SET);
char buffer&#91;50];
int n = read(fd, buffer, sizeof(buffer));
if (n > 0) {
buffer&#91;n] = '\0';
printf("文件内容: %s\n", buffer);
}

// 关闭文件后,数据才真正删除
close(fd);
printf("关闭文件后,数据真正删除\n");
}
}

// 清理剩余文件
unlink("multi_link.txt");

return 0;
}

https://www.calcguide.tech/2025/08/07/unlink系统调用及示例/

data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">

https://www.calcguide.tech/2025/08/26/linux开源软件路线图/

data-ad-format="auto" data-full-width-responsive="true">