我一直很好奇rem
Linux 是如何工作的,并试图编写自己的C
代码来删除文件,但是当我搜索答案时,我只得到了使用remove()
系统调用的程序。
有没有其他方法可以在不使用系统调用的情况下完成这项工作,比如编写自己的代码来完成这项工作?
我已经通过C归档完成了文件的复制,但是找不到通过C删除文件的解决方案。
我一直很好奇rem
Linux 是如何工作的,并试图编写自己的C
代码来删除文件,但是当我搜索答案时,我只得到了使用remove()
系统调用的程序。
有没有其他方法可以在不使用系统调用的情况下完成这项工作,比如编写自己的代码来完成这项工作?
我已经通过C归档完成了文件的复制,但是找不到通过C删除文件的解决方案。
int unlink (const char *filename)
unlink 函数删除文件名filename。函数 unlink 在头文件 unistd.h 中声明。此函数在成功完成时返回 0,在错误时返回 -1
如果要删除文件,请使用
remove
功能。如果您想了解标准库的幕后情况,您可以下载 glibc 的源代码(例如)并查看实现。您会看到实际上 INTERNAL_SYSCALL 将在 linux 操作系统上执行:
result = INTERNAL_SYSCALL (unlink, err, 1, file);
(来自 debian eglibc-2.15 包中的 /sysdeps/unix/sysv/linux/unlinkat.c)
如果您想更进一步,甚至不使用该系统调用,您将不得不实现自己的文件系统逻辑,因为文件系统系统调用只是为不同的文件系统提供了一个抽象层。
如果您不想使用干净、通常的方式,您可以打开 /dev/sd** 并使用您的文件系统。
顺便说一句,remove() 不是系统调用(man 3 remove)。
删除文件的传统方法是使用unlink(2)函数,如果 path 是文件,则从remove(3)调用该函数。
#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;
}