zoukankan      html  css  js  c++  java
  • Linux C创建临时文件mktemp, mkstemp

    mktemp 创建临时文件名

    创建一个独特的文件名,每次调用得到的文件名都不一样。

    注意:该函数只产生文件名,并不创建文件。

    #include <stdlib.h>
    
    char *mktemp(char *template);
    
    • 参数
      template 必须是一个字符数组,末尾6个字符必须是"XXXXXX",比如可以是"test-XXXXXX"(不含目录),或者"/tmp/test.XXXXXX"(含目录),而且不能是字符串常量。因为函数会改变template最后6个字符,返回最终文件名

    • 返回值
      返回的是得到的最终唯一文件名 。是否包含目录目,取决于输入参数template是否包含了目录。

    mktemp存在严重的安全风险,不建议使用,建议使用mkstemp。因为一些4.3BSD实现用当前进程ID和单个字母来替换 XXXXXX
    man mktemp(3)

    BUGS
    Never use mktemp(). Some implementations follow 4.3BSD and replace XXXXXX by
    the current process ID and a single letter, so that at most 26 different
    names can be returned. Since on the one hand the names are easy to guess,
    and on the other hand there is a race between testing whether the name exists
    and opening the file, every use of mktemp() is a security risk. The race is
    avoided by mkstemp(3).

    示例:

    char *tt = "test-XXXXXX";
    char template[256];
    char *s;
    
    strcpy(template, tt);
    s = mktemp(template);
    printf("template = %s, s = %s
    ", template, s);
    

    运行结果(每次产生的文件名都不一样):

    template = test-9ZTDNE, s = test-9ZTDNE
    

    mkstemp 创建临时文件

    每次调用,会创建一个临时文件,并且临时文件名唯一。

    #include <stdlib.h>
    
    int mkstemp(char *template);
    
    • 参数
      template 同mktemp,必须是字符数组,且以"XXXXXX"结尾,不能是字符串常量。

    • 返回值
      指向临时文件的文件描述符

    示例:

    char name[256] = "test.XXXXXX";
    int fd;
    if ((fd = mkstemp(name)) < 0) {
        perror("mktemp error");
        return -1;
    }
    
    strcpy(name, name);
    unlink(name); /* 进程结束后自动删除文件 */
    
    printf("%s
    ", name);
    char buf[256];
    strcpy(buf, "hello, world");
    if (write(fd, buf, strlen(buf)) < 0) {
        perror("write");
        return -1;
    }
    
    close(fd);
    

    运行结果(会在当前目录下产生临时文件,并且打印):

    test.5C0SaB
    
  • 相关阅读:
    数据库-第六章 关系数据理论-6.2.1 函数依赖
    数据库-第六章 关系数据理论-6.1 问题的提出
    编译原理-第四章 语法分析-4.4 自顶向下的语法分析
    计算机组成及系统结构-第五章 指令系统
    编译原理-第四章 语法分析-4.3 设计文法
    Java数据结构之堆和优先队列
    进程与线程杂谈
    Java的多态浅谈
    Java的自定义注解使用实例
    elasticsearch6.6.2在Centos6.9的安装
  • 原文地址:https://www.cnblogs.com/fortunely/p/15009966.html
Copyright © 2011-2022 走看看