荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: FreeBSD (FreeBSD), 信区: Linux
标  题: 容易忽视的函数和调用(六)-- mktmp(zz)
发信站: BBS 荔园晨风站 (Sat Jan  8 17:52:37 2000), 站内信件

【 以下文字转载自 FreeBSD 的信箱 】
【 原文由 liugang.bbs@melon.gznet.edu.cn 所发表 】
发信人: cpu (奔腾的心), 信区: Solaris
标  题: 容易忽视的函数和调用(六)-- mktmp(zz)
发信站: 华南网木棉站 (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: 210.39.3.50]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 210.39.3.71]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店