Linux操作临时文件

简介:

使用临时文件要考虑几个问题:

  1. 保证临时文件间的文件名不互助冲突。
  2. 保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。

Linux中提供了mkstemp 和 tmpfile 函数来处理临时文件。

mkstemp函数

int mkstemp(char *template);

mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。

临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int write_temp_file(char* buffer,size_t length) {
int len=length;
char filename_template[]="/tmp/temp_file.XXXXXX";
int fd=mkstemp(filename_template);
unlink(filename_template);//Unlink the file, so it'll be removed when close
printf("Template file name:%s\n",filename_template);
write(fd,&len,sizeof(len));
write(fd,buffer,len);
return fd;
}

char* read_temp_file(int fd, size_t* length) {
char* buffer;
lseek(fd,0,SEEK_SET);
read(fd,length,sizeof(size_t));
buffer=(char*)malloc(*length);
read(fd,buffer,*length);
close(fd); // Temp file will be deleted
return buffer;
}

int main(int argc, char** argv) {
char buffer[]="Test template files";
int fd=write_temp_file(buffer,strlen(buffer));
int len=0;
char* result=read_temp_file(fd,&len);
printf("Len:%d\nContent:%s\n",len,result);
free(result);
return 0;
}

tmpfile函数

如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。

另外,linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和安全性的问题,不建议使用。


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2011/06/11/2078483.html,如需转载请自行联系原作者


相关文章
|
6天前
|
Linux
使用Linux命令`comm`进行文件比较
`comm`命令在Linux中用于比较两个已排序文件的差异和共同点。基本语法是`comm [OPTION]... FILE1 FILE2`。它输出三列:公共行、仅在第一个文件中的行和仅在第二个文件中的行。选项如`-1`, `-2`, `-3`用于隐藏相应列。注意,输入文件必须排序,且`comm`不考虑行内空白差异。此命令在文本处理和数据分析中非常有用。
|
2天前
|
Linux API C语言
C语言读写BMP文件-EasyBmp【 linux 平台】
**EasyBmp** 是一个49KB的轻量级C++图像处理库,专注于BMP格式,提供简单易用的API。它的特点是小巧、开源、易于理解和高度定制。通过示例代码展示了如何轻松读取、缩放和保存BMP图像。适合需要高效处理BMP图像的开发者。
|
3天前
|
Linux Shell
蓝易云 - Linux下查看文件和文件夹大小
这两个命令是查看Linux系统中文件和文件夹大小的基本工具,可以根据需要进行组合使用。
5 0
|
3天前
|
应用服务中间件 Linux nginx
蓝易云 - Linux使用pid文件结束nginx
以上就是使用pid文件结束nginx进程的方法。
5 0
|
3天前
|
缓存 Linux Windows
初识Linux操作系统(根目录下的重要文件)(命令提示符的含义)
Linux系统基于&quot;一切皆文件&quot;的理念,重要文件分布在如/root(root用户目录)、/home(普通用户目录)、/etc(应用配置)、/dev(设备文件)、/boot(内核及启动文件)、/proc(动态系统信息)、/lib64(库文件)、/opt(软件存放)、/tmp(临时文件)。&quot;[root@localhost ~]#&quot;代表管理员在root目录,&quot;$&quot;代表普通用户。创建新用户用`useradd`命令。调节终端字体大小:Ctrl+Shift++增大,Ctrl+减号缩小。绝对路径从根目录开始,相对路径从当前目录开始。
|
5天前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
10 1
|
6天前
|
Linux Python
在 Linux 中查看目录文件数的方法
【6月更文挑战第7天】在 Linux 中查看目录文件数的方法包括:使用 `ls` 命令结合 `wc -l`,`find` 命令,`tree` 命令,以及编程方式(如 Python)。`ls` 和 `find` 命令通过管道传递给 `wc -l` 统计行数,而 `tree` 命令提供树状视图并显示文件数。编程方式则允许自定义实现,例如 Python 中的 `os.walk()`。注意权限、效率和场景适用性,选择合适的方法以提高 Linux 操作效率。
26 3
|
6天前
|
监控 Linux Perl
在 Linux 中显示文件指定行内容的方法和技巧
【6月更文挑战第7天】在 Linux 中查看文本文件指定行,可使用 head/tail 显示文件头/尾部行,sed 的行号指定功能或 awk 进行处理。在代码审查、日志分析和文本处理等场景下,这些命令能提升效率。注意文件编码、行号准确性,并组合使用命令以实现更多功能。通过练习,能更好地掌握这些工具。
31 0
|
6天前
|
存储 数据挖掘 Linux
在 Linux 中找目录中最大文件
【6月更文挑战第7天】在 Linux 中找目录中最大文件:使用 `du` 加 `sort` 命令 (`du -a /path | sort -nr | head -n 1`),`find` 加 `xargs` 和 `sort` (`find /path -type f -print0 | xargs -0 du -h | sort -nr | head -n 1`) 或编写 Python 脚本。适用于服务器管理、数据分析和文件清理,注意文件权限、目录深度和文件系统类型。结合其他命令可提升效率。
22 0
|
6天前
|
Linux
蓝易云 - 修改linux文件权限命令:chmod
例如,`chmod 755 文件名`将给文件设置读/写/执行权限给所有者,读/执行权限给组用户和其他用户。
8 0