我正在寻找下面的例子来理解windows和linux上的文件锁定。程序1使用gcc在windows和linux上都可以工作。
但是第二个只在Linux上工作。特别是在windowsgcc中,结构群的声明出现了问题。我不知道我是否遗漏了什么。另外,即使在我关闭并取消链接第一个例子中的文件后,下次运行该文件也没有解锁。
程序1:在Windows上使用GCC
来源:http://www.c.happycodings.com/Gnu-Linux/code9.html
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
if((fd = open("locked.file", O_RDWR|O_CREAT|O_EXCL, 0444)) == -1)
{
printf("[%d]: Error - file already locked ...n", getpid());
}
else
{
printf("[%d]: Now I am the only one with access :-)n", getpid());
close(fd);
unlink("locked.file");
}
程序2:在Linux上使用GCC
来源:http://beej.us/guide/bgipc/output/html/multipage/flocking.html
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/* l_type l_whence l_start l_len l_pid */
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 };
int fd;
fl.l_pid = getpid();
if (argc > 1)
fl.l_type = F_RDLCK;
if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
perror("open");
exit(1);
}
printf("Press <RETURN> to try to get lock: ");
getchar();
printf("Trying to get lock...");
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("got lockn");
printf("Press <RETURN> to release lock: ");
getchar();
fl.l_type = F_UNLCK; /* set to unlock same region */
if (fcntl(fd, F_SETLK, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("Unlocked.n");
close(fd);
return 0;
}
你能帮助这个,如果可能的话,在这些情况下提供可移植代码的指导方针吗?
使用C运行时库可能很难获得这种操作的可移植性。对于这种事情,你真的需要使用特定于操作系统的代码。
但是,您可以通过检查和理解底层C运行时库实现来实现这一点。这些工具附带了GCC运行时和microsoft运行时的源代码。只要去看看它们是如何实现的。
注意,在Windows上,您可以将CRT文件I/O api与Windows句柄一起使用。只要去看看源码。
我会研究XPDEV,特别是文件包装方法…它们实现了合理的跨平台锁定。