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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

* m/ v- d1 `5 n. f' _使用临时文件要考虑几个问题:
2 c9 K% R+ x3 n# K2 M7 T; \& P0 X1 S$ q% V: Q+ \$ |: I/ ?
  • 保证临时文件间的文件名不互助冲突。
  • 保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。; c6 y1 Y9 W3 e. `& g  C

/ ~1 J8 G( g" r% ~Linux中提供了mkstemp 和 tmpfile 函数来处理临时文件。
. |& O" e7 o, v" {
; J: k: H1 Q2 _" Zmkstemp函数& x& Y3 C1 S: ^- M& S7 p* V) @9 \
* |+ [9 |# y  U) t+ Q) }0 w
int mkstemp(char *template);6 o# W9 k+ d, W+ }* E
mkstemp函数在系统中以唯一的文件名创建一个文件并打开,而且只有当前用户才能访问这个临时文件,并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。 函数返回一个文件描述符,如果执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666,glibc 2.0.7以后的库这个文件的访问权限是0600。
& S! d3 w$ Y: _
4 @3 d9 F1 e2 J临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。
2 D2 J0 n" q% M, Z: h" P  [# I8 R" }3 x* N
#include <stdio.h>/ Y% T- _6 W* {. S" N( \9 |5 L
#include <string.h>) `+ N8 o$ [. b8 b; C( g5 M
#include <unistd.h>
) I, L  C& i4 o2 q#include <stdlib.h>
4 W2 s% @6 h1 r0 T) {" i$ I' N+ z' x) o6 |: U+ f
int write_temp_file(char* buffer,size_t length) {
- t) W8 |/ Y' u  a- L) }6 x    int len=length;
  P! {# j$ m- R* `& Q. r3 K    char filename_template[]="/tmp/temp_file.XXXXXX";- z; i6 G! K" U
    int fd=mkstemp(filename_template);* A; K; P2 p/ Y2 U
    unlink(filename_template);//Unlink the file, so it'll be removed when close
4 Y4 M3 d- m8 R5 c    printf("Template file name:%s\n",filename_template);
, E( q3 \4 x8 c: z6 ]' F    write(fd,&len,sizeof(len));) q% `3 `1 w3 I, K# I' @* r. P
    write(fd,buffer,len);
! U+ Z* S0 E( G- o1 ~$ z" x    return fd;; K: T$ {4 P4 x, G! \; V
}9 @8 B9 U# Y3 X9 L# ^2 n9 m9 B
, T( _" P5 p: g2 I1 k
char* read_temp_file(int fd, size_t* length) {
. _" ~% Y$ y/ V6 Y1 L% y! k    char* buffer;
$ D; [( A$ M$ i3 x    lseek(fd,0,SEEK_SET);
( s. g; L- e8 H! w    read(fd,length,sizeof(size_t));& @! O4 p6 m* j2 d2 z2 ^
    buffer=(char*)malloc(*length);3 E9 X) c/ F5 Y# C" Z7 X- e; l8 G
    read(fd,buffer,*length);, A0 H( A% Y- c. p, |
    close(fd); // Temp file will be deleted- f! {( ~8 O/ d& c$ J" W7 f
    return buffer;& ~6 n8 t7 K" N) l
}# o* w' Q! L2 @$ r
! a% `1 D! z8 V% ]' W9 |- h
int main(int argc, char** argv) {
* `% U% ]- E3 u8 {6 b& x8 Y    char buffer[]="Test template files";0 @+ U1 U, m# `0 j! J  _
    int fd=write_temp_file(buffer,strlen(buffer));
9 J& D; v' G/ I# }& b& P/ l    int len=0;
4 H; ?8 X0 D& Q) w5 L8 c) W3 ^4 Q4 b+ [    char* result=read_temp_file(fd,&len);! k4 r& G7 n7 [6 b5 F' l
    printf("Len:%d\nContent:%s\n",len,result);: r2 B0 J1 Z( S+ Z" M
    free(result);! P# I4 y' n/ R! V3 o
    return 0;
  [3 G+ }6 m0 F) n8 x* ]% I/ S}
1 V; |( u* q: Q% V+ A" s9 D" L' k' E/ Q, K0 z
tmpfile函数
$ P* G0 Y3 n8 h1 p/ {
7 V* L0 S# m' z8 r4 a+ C如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。
! [$ ^/ Q  W9 s9 D# D7 p. a1 B! S/ i4 ~# B: y' j
另外,linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和安全性的问题,不建议使用。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 19:45 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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