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

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#include/* A handle for a temporary file created with write_temp_file. Inthis implementation, it’s just a file descriptor. *//*write_temp_file是个操作临时文件的句柄,本例中只是个文件描述符*/typedef int temp_file_handle;/* Writes LENGTH bytes from BUFFER into a temporary file. Thetemporary file is immediately unlinked. Returns a handle to thetemporary file. *//*在这函数从BUFFER中向临时文件写入LENGTH字节数据。临时文件在刚一创建就被删除掉。函数会返回临时文件的句柄。*/temp_file_handle write_temp_file (char* buffer, size_t length){/* Create the filename and file. The XXXXXX will be replaced withcharacters 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 thefile 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 withwrite_temp_file. The return value is a newly allocated buffer ofthose contents, which the caller must deallocate with free.*LENGTH is set to the size of the contents, in bytes. Thetemporary 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 togo away. *//*关闭文件描述符,临时文件被彻底删除*/close (fd);return buffer;}

tmpfile函数

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

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

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有 的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件 , file , 函数 , file数据linux , temp下文件被删除 , The , Temporary , 临时temp , file函数 , 临时 unlink linux系统c语言编程、c语言编写操作系统、c语言写操作系统、c语言开发操作系统、c语言 操作系统,以便于您获取更多的相关知识。

在linux系统下使用C语言操作临时文件相关推荐

  1. linux进程创建心得体会,Linux系统下计算机C语言编程心得体会

    摘    要:C语言编程是目前计算机领域中应用较为广泛的编程语言, 很多信息系统都基于C语言编程实现.Linux系统是免费且可以自由传播的操作系统, 支持多用户.多平台应用, 实际生活中应用也较为广泛 ...

  2. Linux系统下计算机C语言的编程技巧

    C语言在多程序编辑中发挥着基础性作用,并在国际范围得到了全面应用.科技的蓬勃发展,使得人们更加重视C语言技术,并对C语言提出更多的要求.但Linux系统是最主要的操作系统之一,基于此开展C语言编程工作 ...

  3. Linux系统下文件与目录操作讲解

    Linux系统下文件与目录操作 在Linux系统中有一句话叫做,一切皆文件.上节我们说的I/O操作,对于普通I/O操作,都是打开.读写.关闭.这节我们通过stat结构体来了解文件的一些基本信息和本质特 ...

  4. Linux系统下文件与目录操作

    Linux系统下文件与目录操作  与其它操作系统一样,在Linux系统下用户的数据和程序也是以文件的形式保存的.所以在使用Linux的过程中,是经常要对文件与目录进行操作的.现在我们就以一个Windo ...

  5. linux 文件目录操作,Linux系统下文件与目录操作

    与其它操作系统一样,在Linux系统下用户的数据和程序也是以文件的形式保存的.所以在使用Linux的过程中,是经常要对文件与目录进行操作的.现在我们就以一个Window用户的立场来学习一下Linux下 ...

  6. 在linux系统下格式化移动硬盘的操作

    由于将移动硬盘装成了linux,因此它的格式在win下面读不出来了.打算在linux系统下将它给格成ntfs,所以有了以下这篇博客. 一 查看硬盘 sudo fdisk -l 找到自己的那块硬盘,一般 ...

  7. Linux系统下使用java语言调用海康威视SDK连接摄像头过程记录

    1.准备工作 1.1. 设备型号 萤石多功能互联网摄像头 CS-C2C-3B2WFR 1.2. SDK下载 通过海康威视官网可以下载到最新的Linux下的SDK开发包,分为32位和64位,根据电脑情况 ...

  8. Linux系统下的C语言学习

    学习目标: C Learning- C语言的优点 C语言的缺点 打印C语言的特点 学习内容: 前言 C语言的优点 1. C语言简洁.紧凑.灵活 C语言的核心内容很少,只有32个关键字,9种控制语句:程 ...

  9. 用linux命令创建表主键,Linux系统下SQL Server数据库操作

    Linux系统SQL Server数据库操作命令 连接数据库 sqlcmd命令 创建数据库: 查看所有数据库: 创建表 添加主键约束 外部关键字 怎么添加唯一约束 怎么添加非空约束 怎么使用默认约束 ...

最新文章

  1. php empty详解
  2. Visual Studio 2008 每日提示(二十三)
  3. linux下数据库mysql命令大全_linux中mysql数据库操作命令大全有哪些
  4. iOS之性能优化·优化App界面的渲染与流畅度
  5. 解析全局配置文件的时候,做了什么?
  6. php json传输被过滤,php-the_content过滤器,用于将自定义字段添加到JSON响应
  7. 全栈深度学习第6期: 模型测试和部署
  8. 实现页面弹框背景虚化效果
  9. 如何修改Vue和springboot的默认端口号
  10. 蓝桥杯 ALGO-50 算法训练 数组查找及替换
  11. 20171016课程随笔
  12. step1: python scrapy安装
  13. 震撼!七大议题全数入选!九州云与您相约温哥华
  14. 《任正非:管理的灰度》总结反思
  15. sourcetree拉取项目时报错,解决两个冲突
  16. 教你10分钟组装台式电脑
  17. 改进YOLOv5系列:首发结合 RepLKNet 构建 最新 RepLKDeXt 结构|CVPR2022 超大卷积核, 越大越暴力,大到31x31, 涨点高效
  18. NumberPicker
  19. 服务器主机安装win10系统稳定吗,服务器主机上安装win10
  20. MAC MacVim及Vundle安装

热门文章

  1. world wide patent search website
  2. 徐教授的对于商业模式创新的讲座!十分有用!
  3. 一种新的在线学习的方法:能够克服单人多任务学习的困难!
  4. 我妈妈的优点:做事情特别细致
  5. 从锁的原理到构建分布式锁
  6. WPF usercontrol 自定义依赖属性
  7. centos内核参数优化
  8. CSS3--幽灵按钮特效(实例)
  9. 一起谈.NET技术,数据库访问的性能问题与瓶颈问题
  10. ACL在路由器上设置例子