0

我想在删除文件之前切碎我的 C 程序生成的一些临时文件。

目前我正在使用

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

从我的程序中,但我认为不是调用system函数不是最好的方法(如果我错了,请纠正我..)还有其他方法可以做到吗?如何从我的代码本身中粉碎文件?图书馆,还是什么?另外,关于删除部分,这个答案好吗?

4

2 回答 2

3

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

这种方式的优点是:

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

第二点很重要。可能夸大了精心清理文件的必要性(Peter Gutmann,在相关维基百科页面上引用的评论中,将他的方法的一些用途描述为“巫毒”),但这并不重要:在任何安全环境中,使用一个预先存在的工具几乎总是比使用自制的东西更有防御性。

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

也就是说,如果这只是一个低影响的整理工作,那么简单mmap的文件并快速写入零可能会更直接。

于 2015-03-21T12:04:37.497 回答
2

您可以使用以下代码:

#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;
}
于 2015-03-21T11:52:03.000 回答