我想在删除文件之前切碎我的 C 程序生成的一些临时文件。
目前我正在使用
system("shred /tmp/datafile");
system("rm /tmp/datafile");
从我的程序中,但我认为不是调用system
函数不是最好的方法(如果我错了,请纠正我..)还有其他方法可以做到吗?如何从我的代码本身中粉碎文件?图书馆,还是什么?另外,关于删除部分,这个答案好吗?
我能问一下为什么你认为这不是实现这一目标的最佳方式吗?如果确实有必要不可挽回地销毁文件内容,这对我来说似乎是一个很好的解决方案。
这种方式的优点是:
第二点很重要。可能夸大了精心清理文件的必要性(Peter Gutmann,在相关维基百科页面上引用的评论中,将他的方法的一些用途描述为“巫毒”),但这并不重要:在任何安全环境中,使用一个预先存在的工具几乎总是比使用自制的东西更有防御性。
关于我对您当前使用 的方法的唯一批评system(3)
是,由于它在 中查找shred
程序PATH
,因此原则上有人可以用它玩游戏并恶作剧。但这很容易处理:使用fork(2)
并execve(2)
使用其完整路径调用特定的二进制文件。
也就是说,如果这只是一个低影响的整理工作,那么简单mmap
的文件并快速写入零可能会更直接。
您可以使用以下代码:
#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;
}