EDA365电子论坛网
标题:
Linux怎样对临时文件进行操作
[打印本页]
作者:
haidaowang
时间:
2020-3-21 13:42
标题:
Linux怎样对临时文件进行操作
& n* Z) J+ \5 ]% R- y
使用临时文件要考虑几个问题:
0 s4 j0 i& ^! f2 o8 h" a
3 a8 A$ l, U; u8 `) ?
保证临时文件间的文件名不互助冲突。
保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。
) Z' @: {2 q1 t/ L2 R5 f% \* _( D
9 X2 K! W* A8 a* _' c8 J* ?. {% s
Linux中提供了mkstemp 和 tmpfile 函数来处理临时文件。
: V* F( C% f1 y9 ]
: G2 {7 ] z- [" V s# _
mkstemp函数
6 {; T/ ~+ s( ^2 m+ q% t
r3 d) u# D( N2 n- \
int mkstemp(char *template);
6 ^2 }5 o: ]2 \/ Y# H, ?
mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
( b3 l) @# S0 ]
! z1 ?- m1 q) T& c4 o4 K
临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
" J) ?* E$ ]7 Y( E+ G
9 Y( `- ~' u) l
#include <stdio.h>
. ^6 T, z2 ]0 `
#include <string.h>
# R- N+ R: r! Q0 [5 X
#include <unistd.h>
. X/ Q' O8 z o/ m/ ~
#include <stdlib.h>
1 O3 w9 L7 w6 o. T4 y5 t
8 {# r4 R" |' H+ X1 P
int write_temp_file(char* buffer,size_t length) {
. Q5 g6 L' u: ]1 y$ h
int len=length;
0 S! m& s! g/ D3 N9 h$ A$ ]
char filename_template[]="/tmp/temp_file.XXXXXX";
! @& }2 _( T o* y, I# J
int fd=mkstemp(filename_template);
* q* ^! e# N' a0 D2 ?7 U+ {
unlink(filename_template);//Unlink the file, so it'll be removed when close
S. f6 N& o, n4 Z# W4 p
printf("Template file name:%s\n",filename_template);
, m6 o) d7 X( Q) v* |8 {, E5 T5 F
write(fd,&len,sizeof(len));
+ ?+ [+ j7 Y* t1 t9 M! j \9 X
write(fd,buffer,len);
( b& a" l3 s. ~5 \; E2 V
return fd;
9 h: y; w- `9 z" w2 i
}
% p. Y/ V: x: y7 d- Q+ }8 q& C$ }, [
- H. @/ k! g l) R3 b/ j2 T$ h9 C
char* read_temp_file(int fd, size_t* length) {
' V, }& `% o; ^- j# g
char* buffer;
- l! e; }/ ~$ f. H# J6 b
lseek(fd,0,SEEK_SET);
( t9 \, o" n9 ?9 H% o6 G
read(fd,length,sizeof(size_t));
, J& x& h2 z2 \; P2 Y2 A
buffer=(char*)malloc(*length);
9 h. M, ~) p& u. b' o- Z \1 ^
read(fd,buffer,*length);
4 r5 P) J; H# Y# a5 h- R
close(fd); // Temp file will be deleted
6 c. Z2 v+ y I: x9 J
return buffer;
9 O$ R% ?4 g- v, f& O
}
$ I8 x# O7 j2 L, g; i7 S
u* }0 B) s% B0 s; X5 Y
int main(int argc, char** argv) {
3 o8 b; @6 h8 V3 @$ b# r# w( ~3 q+ K4 H& k
char buffer[]="Test template files";
Q/ t7 c( N: e7 ^0 N( s6 D
int fd=write_temp_file(buffer,strlen(buffer));
0 ^% Y' i4 _$ Q! Q$ j7 r
int len=0;
5 i: l+ S' c4 d9 Y
char* result=read_temp_file(fd,&len);
+ B5 @5 N3 @! Y4 P: n2 w
printf("Len:%d\nContent:%s\n",len,result);
$ f% D' R8 H) ~4 |, u! v
free(result);
/ I. m2 u0 R: l9 L
return 0;
/ l0 b3 z6 |% A Q% Z4 ?
}
8 N( v' V+ G! D( U: G5 y
% c) W8 y( G9 y+ L* c" y
tmpfile函数
0 a& L$ ~0 J+ w ~% ^! o/ g1 {7 K
/ J/ P+ q; S# y* E# f
如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。
, P) |9 [5 ]& k1 Q; b; x
. }/ f+ G' d8 S% h& J {" |
另外,linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和安全性的问题,不建议使用。
作者:
ExxNEN
时间:
2020-3-21 15:19
Linux怎样对临时文件进行操作
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2