找回密码
 注册
关于网站域名变更的通知
查看: 271|回复: 1
打印 上一主题 下一主题

Linux怎样对临时文件进行操作

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-3-21 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

. W* K2 K1 v3 ^" v/ ?使用临时文件要考虑几个问题:
7 k8 u" a2 j% A+ J  t6 u- o, M1 g- {: W) F
  • 保证临时文件间的文件名不互助冲突。
  • 保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。% f2 G3 v( {* O4 g8 H. a: G- ^2 P+ C
. E" `8 t' J# k! \- t1 U
Linux中提供了mkstemp 和 tmpfile 函数来处理临时文件。
% }3 e3 B3 ?1 i8 |  F  P  {4 B7 `; H- s
mkstemp函数
/ p0 l# r6 m4 Z  I1 R
* Z2 j! }7 c  k% aint mkstemp(char *template);
& J/ E0 R0 ]$ ~. ^% Bmkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
/ E2 S) b5 C  k* [( R! h: z2 O: `! U6 {  W$ s
临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
. M+ u- E8 E# _; ^/ K
0 Q* D6 g/ L2 c3 ~* N* u3 D3 v, i#include <stdio.h>7 ~$ A/ ^9 i. k) K) g
#include <string.h>
( }4 l2 q" i- `* b2 d#include <unistd.h>
( A- e. C& ~" v" o#include <stdlib.h>- T0 k/ u3 L5 |9 f' i
7 P: X/ `! u6 L  Z0 \3 N4 G6 U
int write_temp_file(char* buffer,size_t length) {
  }, d3 b7 F) s- i# `    int len=length;4 L7 C, ?$ m. k4 S3 x
    char filename_template[]="/tmp/temp_file.XXXXXX";! E) u  m0 h- `- E4 |; ]! }' ?" a  w
    int fd=mkstemp(filename_template);! Q& p* d; x& Y1 y/ k
    unlink(filename_template);//Unlink the file, so it'll be removed when close" T" ~  T+ T5 z$ R+ C/ f+ g5 c
    printf("Template file name:%s\n",filename_template);
# F* i0 ]! }% H6 U! ?; h3 n    write(fd,&len,sizeof(len));" K$ i% N+ g+ t5 O. f) K
    write(fd,buffer,len);
7 K, q9 L- n4 ~    return fd;
: M2 k3 N* j5 G/ q6 c# R+ d: K}
( d- H" Y' M, m  h; |/ V3 s+ Z, m9 H% b) a, M+ y7 J- i
char* read_temp_file(int fd, size_t* length) {
* Z% C/ d# }8 V0 w! C% R' _5 l    char* buffer;
) Z# h% j+ Y) D+ r/ X    lseek(fd,0,SEEK_SET);
) W6 L1 e9 p# @5 D- u    read(fd,length,sizeof(size_t));
6 e5 x! q9 B) q$ _$ G3 v    buffer=(char*)malloc(*length);
, p$ V7 c' B2 x( h( G/ e, `. o4 }    read(fd,buffer,*length);
- A; m5 n; T* R# A    close(fd); // Temp file will be deleted
9 L! |/ G3 t) e; Y% @9 c. G6 C- c    return buffer;
& a0 @3 G- o$ n2 J: g}
/ s& [7 I, }" z% @6 p* j
9 u/ S: R1 {1 P4 [! Dint main(int argc, char** argv) {
, H) K* D) [4 `  i) Q# {( S    char buffer[]="Test template files";
5 T2 M$ S) [; W2 I# U' l6 t. J    int fd=write_temp_file(buffer,strlen(buffer));
9 e3 `4 m& O  _    int len=0;% c4 ~! j) l0 y0 V' T5 e" v
    char* result=read_temp_file(fd,&len);5 w5 \0 T# e" f
    printf("Len:%d\nContent:%s\n",len,result);4 |8 {0 h: n, N' s2 e4 c
    free(result);
5 K; z) Z, Z) ^( f+ j% {2 a8 `    return 0;
' {1 l+ q2 D( C# F7 G}$ v) L. n( A7 }; E4 T9 h  @
7 F' t  {9 ]! w% K" t+ E6 a
tmpfile函数& I( }$ M4 w* F8 G  Y1 w, n
$ [: ^; c, t) {7 b0 H
如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。
  R- K2 T: v& K
% T0 y) z) t! T0 W6 t另外,linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和安全性的问题,不建议使用。

该用户从未签到

2#
发表于 2020-3-21 15:19 | 只看该作者
Linux怎样对临时文件进行操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 17:36 , Processed in 0.140625 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表