服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|

CentOS下对临时文件的操作之mkstemp讲解

2019-06-27 14:14网络 Centos

今天小编为大家带来的是CentOS下对临时文件的操作之mkstemp讲解;希望对大家会有帮助,感兴趣的朋友一起去看看吧

使用临时文件要考虑几个问题:

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

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

Linux中提供了mkstemp 和 tmpfile 函数来处理临时文件。

mkstemp函数

int mkstemp(char *template);

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

临时文件使用完成后应及时删除,否则临时文件目录会塞满垃圾。由于mkstemp函数创建的临时文件不能自动删除,所以执行完mkstemp函数后要调用unlink函数,unlink函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关闭文件操作符,或者程序退出后临时文件被自动彻底地删除。

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片  
<span style="font-size:18px;">#include <stdio.h>  
#include <string.h>  
#include <unistd.h>  
#include <stdlib.h>  
  
int write_temp_file(char* buffer,size_t length) {  
    int len=length;  
    char filename_template[]="/tmp/temp_file.XXXXXX";  
    int fd=mkstemp(filename_template);  
    unlink(filename_template);//Unlink the file, so it'll be removed when close  
    printf("Template file name:%s\n",filename_template);  
    write(fd,&len,sizeof(len));  
    write(fd,buffer,len);  
    return fd;  
}  
  
char* read_temp_file(int fd, size_t* length) {  
    char* buffer;  
    lseek(fd,0,SEEK_SET);  
    read(fd,length,sizeof(size_t));  
    buffer=(char*)malloc(*length);  
    read(fd,buffer,*length);  
    close(fd); // Temp file will be deleted  
    return buffer;  
}  
  
int main(int argc, char** argv) {  
    char buffer[]="Test template files";  
    int fd=write_temp_file(buffer,strlen(buffer));  
    int len=0;  
    char* result=read_temp_file(fd,&len);  
    printf("Len:%d\nContent:%s\n",len,result);  
    free(result);  
    return 0;  
}</span>

tmpfile函数

如果您使用C library I/O函数,并且并没有另一个程序使用这个临时文件,有个更简洁的函数——tmpfile。tmpfile函数创建并打开一个临时文件,并且自动执行了unlink。tmpfile函数返回一个文件描述符,如果执行失败返回NULL。当程序执行了fclose或者退出时,资源被释放。

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

延伸 · 阅读

精彩推荐
  • Centoscentos修改dhcpd日志如何可以不记入系统日志?

    centos修改dhcpd日志如何可以不记入系统日志?

    一些朋友对于centos修改dhcpd日志如何可以不记入系统日志不知道如何操作?今天小编将为大家带来centos修改dhcpd日志不记入系统日志的方法,感兴趣的朋友一起去看看吧...

    centos之家4732019-06-13
  • CentosCentOS下VIM实用基本操作技巧详解

    CentOS下VIM实用基本操作技巧详解

    vim是Vi IMproved,是编辑器Vi的一个加强版,一个极其强大并符合IT工程师(程序员、运维)习惯的编辑器。今天小编为大家带来的是CentOS下VIM实用基本操作技巧详解;有需要的朋友一起去看看吧...

    CentOS之家4812019-06-14
  • CentosCentOS 7.1开机运行模式run level详解

    CentOS 7.1开机运行模式run level详解

    在大多数的linux发行版本中,通常有8个 runlevel;今天小编为大家带来的是CentOS 7.1开机运行模式run level详解,希望对大家会有帮助,有需要的朋友一起去看看吧...

    CentOS之家3552019-06-12
  • CentosCentOS 增加IP地址的方法

    CentOS 增加IP地址的方法

    这篇文章主要介绍了CentOS 增加IP地址的方法,需要的朋友可以参考下...

    CentOS之家4942019-05-29
  • Centos如何使用Xmanager远程连接Centos6.5?

    如何使用Xmanager远程连接Centos6.5?

    一些朋友问小编如何使用Xmanager远程连接Centos6.5?下面小编为大家带来使用Xmanager远程连接Centos6.5的方法,希望对大家会有帮助,有需要的朋友一起去看看吧...

    Centos之家4692019-05-28
  • CentosCentOS7上如何安装Kafka?CentOS7上安装Kafka教程

    CentOS7上如何安装Kafka?CentOS7上安装Kafka教程

    Kafka 是一种高吞吐的分布式发布订阅消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等。那么CentOS7上如何安装Kafka?下面小编将为大家带来CentOS7上安装Kafka教程!有需要的朋友一起去看看吧...

    CentOS之家3662019-05-27
  • CentosCentos安装nmon讲解

    Centos安装nmon讲解

    很多朋友对于Centos安装nmon时候会有一些迷惑。今天小编为大家分享的是Centos安装nmon讲解;希望对大家会有帮助,有需要的朋友一起去看看吧...

    脚本之家2022019-06-07
  • CentosCentos如何设置不同网段的互通?Centos设置不同网段的互通的方法

    Centos如何设置不同网段的互通?Centos设置不同网段的互通的方法

    一些朋友不知道Centos如何设置不同网段的互通?下面小编将为大家带来Centos设置不同网段的互通的方法;希望能够帮助到大家,有需要的朋友一起去看看吧...

    脚本之家3432019-06-10