如何在不使用删除系统调用的情况下使用C程序删除(完全删除)文件?

时间:2013-05-15 11:53:16

标签: c linux ubuntu-12.04

我一直很好奇Linux中的rem如何工作并尝试编写我自己的C代码可以删除文件但是当我搜索答案时,我只得到了正在使用的程序remove()系统调用。

有没有其他方法可以不使用系统调用来编写自己的代码来完成这项工作?

我已经完成了通过C文件复制文件,但找不到通过C删除文件的解决方案。

5 个答案:

答案 0 :(得分:11)

int unlink (const char *filename)

unlink函数删除文件名filename。函数unlink在头文件unistd.h中声明。成功完成时此函数返回0,错误时返回-1

答案 1 :(得分:6)

如果要删除文件,请使用

remove

功能。如果您想了解标准库的幕后故事,可以下载glibc的源代码(例如)并查看实现。您将看到实际上将在linux os上执行INTERNAL_SYSCALL:

result = INTERNAL_SYSCALL (unlink, err, 1, file);

(来自debian eglibc-2.15软件包的/sysdeps/unix/sysv/linux/unlinkat.c)

如果你想更进一步甚至不使用那个系统调用,你必须实现自己的文件系统逻辑,因为文件系统系统调用只是为不同的文件系统提供了一个抽象层。

答案 2 :(得分:2)

如果您不想使用干净,通常的方式,可以打开/ dev / sd **并使用您的文件系统。

顺便说一句,remove()不是系统调用(man 3删除)。

答案 3 :(得分:1)

删除文件的传统方法是使用unlink(2)函数,如果path是文件,则从remove(3)调用。

答案 4 :(得分:0)

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main(){
        int status;
        pid_t pid = fork();
        if(-1 == pid){
                printf("fork() failed");
                exit(EXIT_FAILURE);
        }else if(pid == 0){
                execl("/bin/sh", "sh", "-c", "rm /tmp/san.txt", (char *) NULL);
        }else{
                printf("[%d]fork with id %d\n",pid);
                waitpid(pid,&status,0);
        }
return 0;
}