EDA365电子论坛网

标题: Linux怎样对临时文件进行操作 [打印本页]

作者: haidaowang    时间: 2020-3-21 13:42
标题: Linux怎样对临时文件进行操作
& n* Z) J+ \5 ]% R- y
使用临时文件要考虑几个问题:
0 s4 j0 i& ^! f2 o8 h" a3 a8 A$ l, U; u8 `) ?
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 Pint 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 deleted6 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 Yint 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" ytmpfile函数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