linux的文件锁

我尝试使用临时文件:

char *temp = tempnam(NULL, "myapp_");
printf("Tempname: %s", temp)     // Prints /tmp/myapp_random
while (1) { }

但当我检查/ tmp(当应用程序仍在运行时),myapp_random不存在!

至于使用File Locks,我无法很好地掌握它,我试着看看< fcntl.h>但它似乎专注于文件的指定部分中的锁.我只想将该文件完全用作锁(这就是为什么我更喜欢尝试临时文件的方法).

有任何想法吗?

解决方法:

tempnam不会创建文件,它只会为您提供一个在您调用它时不存在的文件名.

您仍然必须自己创建文件,因此仍然存在另一个进程可能潜入并在您之前创建它的竞争条件.

您实际上并不想使用tempnam,因为这会为每个进程提供自己的文件名,并且它们将能够并发运行.你需要的是一个固定的文件名(例如/tmp/myapp.lck),每个进程打开然后尝试flock.

你最好用flock来获取一个锁文件,fcntl会给你一个更精细的锁定(部分文件),但这并不是真正的要求.

代码将运行如下:

if ((mylockfd = open ("/tmp/myapp.lck", O_CREAT | O_RDWR, 0666)) < 0) {
    // error, couldn't open it.
    return;
}
if (flock (mylockfd, LOCK_EX | LOCK_NB) < 0) {
    // error, couldn't exclusive-lock it.
    return;
}
:
// Weave your magic here.
:
flock (mylockfd, LOCK_UN);

这可能需要一些工作,但应该是一个良好的开端.一个更通用的解决方案是:

int acquireLock (char *fileSpec) {
    int lockFd;

    if ((lockFd = open (fileSpec, O_CREAT | O_RDWR, 0666))  < 0)
        return -1;

    if (flock (mylockfd, LOCK_EX | LOCK_NB) < 0) {
        close (lockFd);
        return -1;
    }

    return lockFd;
}

void releaseLock (int lockFd) {
    flock (lockFd, LOCK_UN);
    close (lockFd);
}

// Calling code here.

int fd;
if ((fd = acquireLock ("/tmp/myapp.lck")) < 0) {
    fprintf (stderr, "Cannot get lock file.\n");
    return 1;
}

// Weave your magic here.

releaseLock (fd);
上一篇:java – ReentrantReadWriteLock:ReadLock和WriteLock之间有什么区别?


下一篇:java – 信号量和条件之间的区别(ReentrantLock)