mkstemp函数

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函数删除文件的目录入口,但临时文件还可以通过文件描述符进行访问,直到最后一个打开的进程关 闭文件操作符,或者程序退出后临时文件被自动彻底地删除。

 

测试代码:

#include
#include
#include 
#include 

#define DEBUG_INFO(format, ...) printf("%s - %d - %s :: "format"\n",__FILE__,__LINE__,__func__ ,##__VA_ARGS__)
 
int main(void){
    int fd;
    char temp_file[]="tmp_XXXXXX";
    
    DEBUG_INFO("创建之前:temp_file = %s",temp_file);
    if((fd=mkstemp(temp_file))==-1){
        printf("Creat temp file faile./n");
        exit(1);
    }
    DEBUG_INFO("创建之后:temp_file = %s,fd = %d",temp_file,fd);
    /*Then you can read or write the temp file.*/
    //ADD YOUR CODE;
    //close(fd);

    write(fd,"hello world",sizeof("hello world"));
    lseek(fd,SEEK_SET,0);
    int res = access(temp_file,F_OK);
    if(res != 0){
        perror("access 1:");
    }else{
        DEBUG_INFO("access %s ok",temp_file);
    }
    unlink(temp_file);
    res = access(temp_file,F_OK);
    if(res != 0){
        perror("access:");
        DEBUG_INFO("access %s fail",temp_file);
    }
    
    char buf[100];
    memset(buf,0,sizeof(buf));
    read(fd,buf,sizeof(buf));
    DEBUG_INFO("buf = %s",buf);
    close(fd);
    
    return 0;
}

 执行结果:

/big/work/ipc/mkstemp.c - 12 - main :: 创建之前:temp_file = tmp_XXXXXX
/big/work/ipc/mkstemp.c - 17 - main :: 创建之后:temp_file = tmp_3uabCW,fd = 3
/big/work/ipc/mkstemp.c - 28 - main :: access tmp_3uabCW ok
access:: No such file or directory
/big/work/ipc/mkstemp.c - 34 - main :: access tmp_3uabCW fail
/big/work/ipc/mkstemp.c - 40 - main :: buf = hello world

实验解析

1 文件名字由tmp_XXXXXX变成了tmp_3uabCW。

2 在unlink之前使用access函数判断文件,文件存在

3 在unlink之后使用access函数判断文件,文件不存在

4 在unlink之前向文件写入hello world,然后将位置调整到0

5 在unlink之后读文件,文件的内容为hello world。读去正常

小结

你可能感兴趣的:(linux,应用,linux)