代码之家  ›  专栏  ›  技术社区  ›  upInCloud

从C程序中分解和删除linux中的文件

  •  0
  • upInCloud  · 技术社区  · 10 年前

    我想在删除C程序生成的一些临时文件之前将其分解。

    当前我正在使用

    system("shred /tmp/datafile");
    system("rm /tmp/datafile");
    

    在我的程序中,但我认为 system 函数不是最好的方法(如果我错了,请纠正我)还有其他方法吗?如何从代码本身中分解文件?图书馆还是什么?此外,关于删除部分,是 this answer 好的

    2 回复  |  直到 8 年前
        1
  •  3
  •   Norman Gray    10 年前

    我能问问你为什么认为这不是实现这一目标的最佳方式吗?如果真的需要无可挽回地销毁文件内容,这对我来说似乎是一个很好的解决方案。

    这种方法的优点是:

    • 该程序已经存在(因此开发速度更快);和
    • 该程序已被信任。

    第二点很重要。有可能夸大精心清理文件的必要性(Peter Gutmann在有关 wikipedia page ,曾将他的方法描述为伏都教),但这并不重要:在任何安全环境中,使用预先存在的工具几乎总是比使用自制工具更具防御性。

    关于我对你目前的方法的唯一批评 system(3) ,是因为它查找 shred 中的程序 PATH 原则上,有人可以用它玩游戏,然后开始恶作剧。但这很容易处理:使用 fork(2) execve(2) 使用其完整路径调用特定二进制文件。

    也就是说,如果这只是一个小影响的整理,那么简单地 mmap 并快速将0写入文件。

        2
  •  2
  •   Max Fomichev    10 年前

    您可以使用以下代码:

    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <stdio.h>
    
    #define BUF_SIZE 4096
    #define ABS_FILE_PATH "/tmp/aaa"
    
    int main()
    {
        //get file size
        struct stat stat_buf;
        if (stat(ABS_FILE_PATH, &stat_buf) == -1)
            return errno;
        off_t fsize = stat_buf.st_size;
    
        //get file for writing
        int fd = open(ABS_FILE_PATH, O_WRONLY);
        if (fd == -1)
            return errno;
    
        //fill file with 0s
        void *buf = malloc(BUF_SIZE);
        memset(buf, 0, BUF_SIZE);
        ssize_t ret = 0;
        off_t shift = 0;
        while((ret = write(fd, buf,
                           ((fsize - shift >BUF_SIZE)?
                           BUF_SIZE:(fsize - shift)))) > 0)
            shift += ret;
        close(fd);
        free(buf);
        if (ret == -1)
            return errno;
    
        //remove file
        if (remove(ABS_FILE_PATH) == -1)
            return errno;
    
        return 0;
    }