Linux的文件锁

我试过使用临时文件

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

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

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

有任何想法吗?

Solutions Collecting From Web of "Linux的文件锁"

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