我尝试使用临时文件:
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
。
对于锁定文件,最好使用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);