unlink系统调用及示例

26. unlink – 删除文件或硬链接

函数介绍

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

函数原型

#include <unistd.h>

int unlink(const char *pathname);

功能

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

参数

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

返回值

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

特殊限制

  • 只能删除文件,不能删除目录(使用rmdir)
  • 如果文件正被进程打开,文件数据不会立即删除

相似函数

  • rmdir(): 删除空目录
  • remove(): 删除文件或空目录
  • unlinkat(): 相对路径版本

示例代码

#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[50];
            int n = read(fd, buffer, sizeof(buffer));
            if (n > 0) {
                buffer[n] = '\0';
                printf("文件内容: %s\n", buffer);
            }
            
            // 关闭文件后,数据才真正删除
            close(fd);
            printf("关闭文件后,数据真正删除\n");
        }
    }
    
    // 清理剩余文件
    unlink("multi_link.txt");
    
    return 0;
}
此条目发表在linux文章分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注