C文件在Windows和Linux上locking行为

我正在研究下面的例子,了解lockingWindows和Linux上的文件。 程序1正在使用gcc在windows和linux上工作。

但是第二个只是在Linux上工作。 特别是winodws中的问题GCC正在进行结构化鸡群声明。 我不知道我是否错过了这里的任何东西。 此外,即使我closures并取消第一个示例中的文件下一次运行文件不解锁。

程序1:使用GCC在Windows上工作

资料来源: 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:使用GCC在Linux上工作

资料来源: 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 lock\n"); 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 Runtime LIbrary进行这种操作可能很难获得可行性。 你真的需要使用操作系统特定的代码这种事情。

但是,您可以通过检查和了解底层的C运行时库实现来实现此目的。 GCC运行时间和Microsofot运行时间的源代码都附带了这些工具。 只要去看看他们是如何升华。

请注意,在Windows上,可以将Windows文件I / O API与Windows句柄一起使用。 只要看看源代码。

我会研究XPDEV特别是文件包装方法…他们实施合理的跨平台锁定。