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

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

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. 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等函数,但是由于健壮性和安全方面理由不建议使用他们。

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

时间: 2024-10-06 03:08:12

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

linux系统下,有没有对文件操作的系统日志?

问题描述 linux系统下,有没有对文件操作的系统日志? 如题.如果有,对文件操作的系统日志存放在了哪个日志文件?若没有,是否是系统默认不记录,需要配置一下才会记录?本人初学linux...望不吝赐教. 解决方案 你说的是history命令及相关的history文件吗? 解决方案二: 自己添加工具来monitor

u盘-Linux系统下,怎样用C语言判断U盘插入和拔出,并获取U盘路径?

问题描述 Linux系统下,怎样用C语言判断U盘插入和拔出,并获取U盘路径? Linux系统下,用C语言判断U盘插入和拔出,并获取U盘路径.名字和容量等信息.请大神们指点指点. 解决方案 首先U盘是块设备,有专门的工具(fdisk,blockdev)可以查看U盘(/dev/sda)的具体信息,也可以通过 C语音open("/dev/sda", ...);ioctl(...)来获取U盘信息. u盘插入后,一般会出现类似/dev/sda或者/dev/block/下面的某个设备,相应的拔出会

在linux系统下R语言安装包,总是报错

问题描述 在linux系统下R语言安装包,总是报错 我使用的是单位的服务器linux系统上的R,那么我想要加载R包的时候是不是没有权限? 因为我安装时总是有关于error: https:// URLs are not supported,是不是我应该安装到我自己的某个(我不知道应该哪个)目录下? 解决方案 R语言的各种报错及其解决方法R语言_安装包

Linux系统下完成Windows的开发环境替换

当下有很多的人都在Windows下进行开发工作,在Windows下搭建相关的开发环境并且使用各种开发工具进行工作.其实更多的专业开发人员会选择Linux操作系统作为他们大的系统环境.理由很简单,Linux运行起来更快,更灵活,更加安全. Windows下的开发环境以及软件 Visual Studio 2010 Visual Studio 是微软公司推出的开发环境.是目前最流行的 Windows 平台应用程序开发环境.Visual Studio 可以用来创建 Windows 平台下的 Window

Linux系统下的文件传输工具:RZSZ的用法

Linux系统下传输方式很多,比如:通过FTP SFTP - 等等.linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地,根据RZSZ特性,这里我们通过SecureCRT提供ZModem配合RZSZ传输工具进行讲解 首先先了解与ssh有关的两个命令可以提供很方便的操作: sz:将选定的文件发送(send)到本地机器 rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到

在Linux系统中安装Go语言的详细教程

  这篇文章主要介绍了在Linux系统中安装Go语言的详细教程,由于国内很多人对谷歌的盲目追捧,导致Go语言在国内的人气远超国外...需要的朋友可以参考下 Go (也叫 "golang")是一款由Google最初开发的编程语言.它自诞生就有几个设计原则:简单性.安全性和速度.Go语言发行版拥有各种调试.测试.调优和代码审查工具.如今Go语言和它的工具链在大多数Linux发行版的基础仓库都可用,用默认的包管理器就可以安装. 在Ubuntu.Debian 或者 Linux Mint上安装G

Linux系统下php获得系统分区信息的方法

 这篇文章主要介绍了Linux系统下php获得系统分区信息的方法,涉及Linux下php系统分析的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了Linux系统下php获得系统分区信息的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 $pars = array_filter(explode("n",`df -h`)); foreach ($pars as $par) { if ($par{0} == '/') {

切换Linux系统下图形界面与Linux命令行模式

  本文为您讲解假如在Linux系统下实现图形界面与Linux命令行模式切换. 一.Linux系统安装的流程中默认语言是英文,而不是中文简体(安装流程中有两次制定语言选项,起决定作用的是第二次) 二.Linux命令行模式切换:切换控制台,由图形转换到控制台模式:ctrl+alt+f1(同时按下3秒钟不要马上松开).由控制台转向图形模式是:alt+f7 三.修改默认的语言项(在控制台下):vi /etc/sysconfig/i18n中的LANG=zh_CN.GB18030(留心大小写,然后重启系统

linux系统下怎么压缩图片

 Linux系统下 批量压缩图片尺寸大小的方法 现在手机用户非常庞大,针对手机用户的流量不得不考虑,但手机网络带宽较小,怎么将互联网上的图片压缩是个难题,在windows上容易,有很多软件,但在linux上有没有办法呢? 经过多次的寻找,还是找到了些方法,这里分享下: 一个比较好用命令行下可以使用的 强大的免费图片工具 ImageMagick Centos系统的安装使用方法: yum install ImageMagick 再输入y确认即可安装完成 接下来调用 系统命令 #include <st