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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

: X1 O) J- n# x使用临时文件要考虑几个问题:
9 S" U8 b7 |, E9 \. w' J, V9 |, U$ v5 k
  • 保证临时文件间的文件名不互助冲突。
  • 保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。
    ; F8 _$ p8 y( w# ]$ }* P  L, ]

+ R- v2 @! ]; ?' ?( HLinux中提供了mkstemp 和 tmpfile 函数来处理临时文件。
6 p: o! c/ T# e( Q# D8 C  M% z' D. h0 a0 r" \0 I
mkstemp函数& m3 `# E, O6 W! [, s8 r* U

, L: E/ b& A" r- N- u/ q- X2 hint mkstemp(char *template);) x' ], m1 o$ r1 Z
mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
# ~0 K) \7 t$ |. u3 {& Z. v( P
! m2 l: l( K( X- V0 D, J# i  e临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
  o" |0 l  M6 o' S
: ?6 F  [0 [; c$ c* B#include <stdio.h>4 u/ [0 s  |8 B
#include <string.h>9 Q" |2 r' t% h* |9 F
#include <unistd.h>% g# m. Q$ Q# ?
#include <stdlib.h>9 {. J$ h( H$ p" U) }+ J" L* @. m
# K, @8 R! c/ K# \; o/ L6 a
int write_temp_file(char* buffer,size_t length) {) e# P# f6 B! ]  a8 R  I2 Z& _( o
    int len=length;  H/ |0 q$ \2 p) S, y2 J
    char filename_template[]="/tmp/temp_file.XXXXXX";
/ Z$ {8 G' [, p7 A  Q3 i    int fd=mkstemp(filename_template);
  V, x( t& s, j' q1 g  o. e    unlink(filename_template);//Unlink the file, so it'll be removed when close
  O, W! U9 e2 j9 ?3 }    printf("Template file name:%s\n",filename_template);
' H/ |0 F  y& H+ ]/ f    write(fd,&len,sizeof(len));2 I1 `! E: r1 _7 Y) ]& C
    write(fd,buffer,len);
! g5 C" Q1 E; v+ p2 R    return fd;* y5 Y4 p* w. U4 @: P& ~. x) I
}) O4 T. ^; x7 c9 x& T8 B/ r/ P3 p

( }6 X! q& J: d2 d5 Dchar* read_temp_file(int fd, size_t* length) {6 f+ }8 P4 b; p- ]0 s* J
    char* buffer;* j2 G2 q3 Y1 x! O
    lseek(fd,0,SEEK_SET);; @$ P/ p) d7 _! x" ^( A
    read(fd,length,sizeof(size_t));! P$ P0 u7 x7 s, Y" `
    buffer=(char*)malloc(*length);
7 m" b' c) T* y  ~0 R$ ^    read(fd,buffer,*length);0 a- z" v6 K4 E+ Y7 S# t
    close(fd); // Temp file will be deleted
6 I7 H" |- N6 i; n    return buffer;9 N3 s5 i: @/ B
}
/ `9 R0 v. [$ x+ \( S1 g& i& f( M
$ |! R0 K% i2 K5 P9 uint main(int argc, char** argv) {
4 W' J. o5 a0 t    char buffer[]="Test template files";
9 q) t& i+ n! h& F    int fd=write_temp_file(buffer,strlen(buffer));! K, K7 z3 n/ y7 a8 Q( [& _& r
    int len=0;$ K+ b9 r1 o0 z. x8 \9 {% q
    char* result=read_temp_file(fd,&len);. a, a6 X, l: k2 J9 ?1 a
    printf("Len:%d\nContent:%s\n",len,result);
  ^% f  _# o6 N, @' h% I    free(result);
1 q8 r- E+ P1 B  W* X    return 0;+ ?# ~7 Y5 z- m/ |3 \
}
+ k+ p6 d$ ^4 M7 U2 d. O* f1 a8 ^; |9 `5 p
tmpfile函数
. }4 _( L. T+ D7 W4 ]7 U
$ g3 f: M1 _# j, b, B如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。$ @) i+ Y1 ?9 t/ R7 ]7 S: [" O, I0 M

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 22:18 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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