Linux 版 (精华区)

发信人: tcpip (偶的昵称改了), 信区: Linux
标  题: 容易忽视的函数和调用(六)-- mktmp     cpu
发信站: 哈工大紫丁香 (Wed Jan  5 16:44:29 2000), 转信

发信人: cpu (奔腾的心), 信区: Solaris

标  题: 容易忽视的函数和调用(六)-- mktmp     cpu

发信站: 华南网木棉站 (Mon Apr 12 19:14:21 1999), 转信

NAME

     mktemp - make a unique file name

SYNOPSIS

     #include <stdlib.h>

     char *mktemp(char *template);

mktemp,就是创建一个唯一的文件名,这个文件名是干什么的呢?一般是个临时文件,

一般是用来作为锁文件的。那么参数template是什么?是用户所需要的临时文件名的

模板,这个模板一般是由一个文件名后跟六个“X”字符,mktemp会把这六个“X”替

换成六个数字,保证处理过的template是唯一的文件名字,然后返回template指针。

比如模板:"/tmp/mytempfile.XXXXXX" 可能被处理成 "/tmp/mytempfile.123456",

处理过的这个文件名在文件系统中肯定是唯一的。

具体应用?我在《unix network programing》里面摘了一段例子,可以给进程间需要

互斥使用的资源加锁,用fcntl实现。用fcntl实现的锁有个好处:当进程因为意外而

当掉(比如收到某些信号)的时候可以自动释放锁,这个比SYSTEM V的semaphore安全

多了,不会因为持有资源的进程当掉后因为没释放锁而让其它进程干瞪眼。

ok,下面就是原码:

#include        <sys/types.h>

#include        <fcntl.h>

#include        <unistd.h>

#include        <stdlib.h>

#include        <errno.h>

struct  flock lock_it, unlock_it;

int     lock_fd = -1;

void my_lock_init(char *pathname)

{

        char    lock_file[64];

        strncpy(lock_file, pathname, sizeof(lock_file));

        lock_file[sizeof(lock_file) - 1] = '\0';

        if (mktemp(lock_file) == NULL) {

                perror("mktemp");

                exit(-1);

        }

        if ((lock_fd = open(lock_file, O_CREAT | O_WRONLY, 0600)) < 0) {

                perror("open lock file");

                exit(-1);

        }

        unlink(lock_file);      /* unlink 不影响文件打开状态,也省却了某些

                                 * 好事者看见锁文件就妄图删除之为快 */

        lock_it.l_type = F_WRLCK;

        lock_it.l_whence = SEEK_SET;

        lock_it.l_start = 0;

        lock_it.l_len = 0;

        unlock_it.l_type = F_UNLCK;

        unlock_it.l_whence = SEEK_SET;

        unlock_it.l_start = 0;

        unlock_it.l_len = 0;

}

void my_lock( )

{

        while (fcntl(lock_fd, F_SETLKW, &lock_it) < 0) {

                if (errno == EINTR)

                        continue;

                else {

                        perror("fcntl lock");

                        exit(-1);

                }

        }

}

void my_unlock( )

{

        if (fcntl(lock_fd, F_SETLKW, &unlock_it) < 0) {

                perror("fcntl lock");

                exit(-1);

        }

}

--

─────────────────────────────────

───────  假如你看我有点累             ██

███  █████  █    

  █                 就请你给我倒碗水    

         █          █      █  █      █  

               假如你已经爱上我             █          █████  █    

  █                 就请你吻我的嘴      

         █          █          

█      █                                              █████  █          █████               

※ 修改:.xh 于 Jan  5 15:33:45 修改本文.[FROM: 202.38.248.62]

※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.96.190.5]

--

※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.118.239.10]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.157毫秒