王朝网络
分享
 
 
 

在linux下使用c语言操作临时文件

王朝c/c++·作者佚名  2008-06-01
宽屏版  字体: |||超大  

/******************************************************************

*本文首发于bbs.bluegem.org的CWorld区

*本人email:chenfei@sohu.com

*如转载本文,请保留首发地和本人联络方式,以方便交流,

谢谢!

******************************************************************/

有时程序需要存储很大量的数据,或者在几个进程间交换数据,这时您可能考虑到使用临时文件。使用临时文件要考虑几个问题:

1、保证临时文件间的文件名不互助冲突。

2、保证临时文件中内容不被其他用户或者黑客偷看、删除和修改。

所以在linux下有专门处理临时文件的函数

mkstemp函数

mkstemp函数将在系统中以独一无二的文件名创建一个文件并打开,而且只有当前用户才有访问这个临时文件的权限,当前用户对这个临时文件可以打开并进行读、写操作。mkstemp函数只有一个参数,这个参数是个以“XXXXXX”结尾的非空字符串。mkstemp函数会用随机产生的字符串替换“XXXXXX”,保证了文件名的唯一性。函数返回一个文件描述符,假如执行失败返回-1。在glibc 2.0.6 以及更早的glibc库中这个文件的访问权限是0666 ,glibc 2.0.7 以后的库这个文件的访问权限是0600。

当临时文件完成她的使命假如不把它清除干净把或者程序由于意外在临时文件被清除前就已经退出,临时文件所在的目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除(请参考下文中的tmpfile函数)。执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,所以临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。

例程:

直接使用advanced linux PRogramming的例程,只把注释翻译一下

#include <stdlib.h>

#include <unistd.h>

/* A handle for a temporary file created with write_temp_file. In

this implementation, it’s just a file descriptor. */

/*write_temp_file是个操作临时文件的句柄,本例中只是个文件描述符*/

typedef int temp_file_handle;

/* Writes LENGTH bytes from BUFFER into a temporary file. The

temporary file is immediately unlinked. Returns a handle to the

temporary file. */

/*在这函数从BUFFER中向临时文件写入LENGTH字节数据。临时文件在刚一创建就被删除掉。函数会返回临时文件的句柄。*/

temp_file_handle write_temp_file (char* buffer, size_t length)

{

/* Create the filename and file. The XXXXXX will be replaced with

characters that make the filename unique. */

/*新建文件名和文件,文件名中的XXXXXX将被随机字符串代替,以保证文件名在系统中的唯一性*/

char temp_filename[] = “/tmp/temp_file.XXXXXX”;

int fd = mkstemp (temp_filename);

/* Unlink the file immediately, so that it will be removed when the

file descriptor is closed. */

/*文件马上被unlink,这样只要文件描述符一关闭文件就会被自动删除*/

unlink (temp_filename);

/* Write the number of bytes to the file first. */

/*首先写入即将写入数据的长度*/

write (fd, &length, sizeof (length));

/* Now write the data itself. */

/*写入数据本身*/

write (fd, buffer, length);

/* Use the file descriptor as the handle for the temporary file. */

/*函数返回文件描述符,作为临时文件的句柄*/

return fd;

}

/* Reads the contents of a temporary file TEMP_FILE created with

write_temp_file. The return value is a newly allocated buffer of

those contents, which the caller must deallocate with free.

*LENGTH is set to the size of the contents, in bytes. The

temporary file is removed. */

/*从被write_temp_file创建的临时文件中读取数据。返回值是含有文件内容的新申请到的内存块,这块内存应该又调用read_temp_file者释放。

*length是临时文件正文内容的长度。执行完read_temp_file函数后临时文件被彻底删除*/

char* read_temp_file (temp_file_handle temp_file, size_t* length)

{

char* buffer;

/* The TEMP_FILE handle is a file descriptor to the temporary file. */

/*fd是访问临时文件的文件描述符*/

int fd = temp_file;

/* Rewind to the beginning of the file. */

/*把文件指针指向文件开头*/

lseek (fd, 0, SEEK_SET);

/* Read the size of the data in the temporary file. */

/*获得临时文件正文长度*/

read (fd, length, sizeof (*length));

/* Allocate a buffer and read the data. */

/*分配内存块,读取数据*/

buffer = (char*) malloc (*length);

read (fd, buffer, *length);

/* Close the file descriptor, which will cause the temporary file to

go away. */

/*关闭文件描述符,临时文件被彻底删除*/

close (fd);

return buffer;

}

tmpfile函数

假如您使用C library I/O函数,并且并没有另一个程序使用这个临时文件(笔者注:按我的理解是在同一进程或具有父子关系的进程组中),有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink了这个临时文件。tmpfile函数返回一个文件描述符,假如执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。

linux系统中还提供mktemp、 tmpnam、 和tempnam等函数,但是由于健壮性和安全方面理由不建议使用他们。

更多内容请看C/C++进阶技术文档 C++编程 Linux文件相关文章专题,或

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有