gpt4 book ai didi

c - linux的文件锁

转载 作者:IT王子 更新时间:2023-10-29 00:12:13 24 4
gpt4 key购买 nike

我尝试使用临时文件:

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

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

至于使用文件锁,我不太了解,我试着看<fcntl.h>但它似乎专注于文件指定部分的锁。我只想将该文件完全用作锁(这就是为什么我更喜欢尝试临时文件方法)。

有什么想法吗?

最佳答案

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

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

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

你最好用 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);

关于c - linux的文件锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6182877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com