Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C程序中删除文件而不使用删除系统调用?_C_Linux_Ubuntu 12.04 - Fatal编程技术网

如何在C程序中删除文件而不使用删除系统调用?

如何在C程序中删除文件而不使用删除系统调用?,c,linux,ubuntu-12.04,C,Linux,Ubuntu 12.04,我一直很好奇Linux中的rem是如何工作的,并试图编写自己的C代码来删除文件,但当我搜索答案时,我只得到了使用remove()系统调用的程序 有没有其他不使用系统调用的方法,比如编写自己的代码来完成这项工作 我已经完成了通过C文件复制文件的工作,但找不到通过C文件删除文件的解决方案。删除文件的传统方法是使用函数,如果路径是文件,则从中调用该函数。如果不想使用干净的常规方法,可以打开/dev/sd**并使用文件系统 顺便说一句,remove()不是系统调用(man 3 remove) unlin

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

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


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

删除文件的传统方法是使用函数,如果路径是文件,则从中调用该函数。

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

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


unlink函数删除文件名filename。函数unlink在头文件unistd.h中声明。如果要删除文件,请使用

remove
功能。如果您想了解标准库的幕后情况,可以下载glibc的源代码(例如)并查看实现。您将看到,实际上将在linux操作系统上执行一个内部系统调用:

result = INTERNAL_SYSCALL (unlink, err, 1, file);
(来自debian eglibc-2.15包中的/sysdeps/unix/sysv/linux/unlinkat.c)

如果您想更进一步,甚至不使用该系统调用,您必须实现自己的文件系统逻辑,因为文件系统系统系统调用只是为不同的文件系统提供了一个抽象层
#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;
}
#包括 #包括 #包括 #包括 int main(){ 智力状态; pid_t pid=fork(); 如果(-1==pid){ printf(“fork()失败”); 退出(退出失败); }否则如果(pid==0){ execl(“/bin/sh”、“sh”、“-c”、“rm/tmp/san.txt”、(char*)NULL); }否则{ printf(“[%d]个叉,id为%d\n”,pid); waitpid(pid和status,0); } 返回0; }
您为什么不想使用remove调用?我认为我们无法做到这一点,因为从内存(即硬盘)中删除文件就像我们的代码与硬件交互一样简单,为此我们必须使用内核(即系统调用).
remove
甚至不是系统调用。可能很有用。可能是重复的或更好的。。。使用
remove()
函数,该函数的作用与此相同,但它是C标准的<代码>#包括。。。int remove(常量字符*文件名)我上面提到过,我不想使用系统调用。是否可以像复制一样使用c文件it@Datta:如果不使用系统调用,则无法删除任何内容。唯一的问题是系统调用有多方便,有多直接。例如,您可以使用
system()
来运行
rm
命令,但它使用
fork()
exec*()
waitpid()
以及调用
system()
的程序中的其他系统调用,而
rm
程序最终还是使用了
unlink()
系统调用,因为不使用系统调用是无法做到这一点的,无论是通过“内部系统调用”(系统调用接口)还是通过其他机制。普通程序不能删除文件;只有内核可以删除。那么,是否将删除视为系统调用?
#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;
}