|
|
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等函数,但是由于健壮性和安全性的问题,不建议使用。 |
|