利用mktemp和fcntl实现进程间互斥操作

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);
        }
}


 » 相关连接:
Linux环境进程间通信——信号 多进程编程 如何启动另一程序的执行exec 信号
互斥锁、条件变量 互斥锁的使用 创建线程 线程、全局变量、线程参数
POSIX线程编程指南
 » 本栏目最新帖:
 » 精华帖:

Powered by PHPWind v6.0 Code © 2003-08