【问题标题】:File locks for linuxlinux文件锁
【发布时间】:2011-09-05 04:31:21
【问题描述】:

我尝试使用临时文件:

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

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

关于使用文件锁,我无法很好地掌握它,我尝试查看<fcntl.h>,但它似乎专注于文件指定部分的锁。我只想将文件完全用作锁(这就是我更喜欢尝试临时文件方法的原因)。

有什么想法吗?

【问题讨论】:

  • 这看起来像 stackoverflow.com/questions/800730/… 的副本
  • @Richard,这个问题是专门针对 Windows 的。这个几乎可以肯定是 UNIXy 类型的,因为 (1) tempnam 在 VC2005 中已被弃用,(2) 代码引用 /tmp/myapp_random 这不是真正的 Windows。

标签: c linux file locking


【解决方案1】:

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

【讨论】:

  • 一百万谢谢!!耶 :D 0_CREAT | 0_RDWR, 0666 工作......我想在你只有 0_CREAT 之前,但这正是我所需要的。非常感谢:)
  • flock(lockFd, LOCK_UN) 之后使用close 是否安全?这不会导致未定义的行为吗?
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 2019-11-24
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多