Windows 和 Linux 上的 C 文件锁定行为
我正在研究下面的示例来了解 Windows 和 Linux 上的文件锁定。程序 1 可以在 Windows 和 Linux 上使用 gcc 运行。
但第二个只能在 Linux 上运行。 winodws GCC 中的问题尤其出在结构 flock 声明中。我不知道我是否在这里遗漏了任何东西。另外,即使我关闭并取消链接第一个示例中的文件以进行下一次运行,该文件也不会解锁。
程序 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;
}
您能帮忙解决这个问题吗?如果可能的话,请提供这些场景中可移植代码的指南吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 C 运行时库可能很难获得此类操作的可靠性。对于这种事情,您确实需要使用操作系统特定的代码。
但是,您可以通过检查和理解底层 C 运行时库实现来使其发挥作用。 GCC 运行时和 Microsoft 运行时的源代码均随工具一起提供。只要去看看它们是如何实施的。
请注意,在 Windows 上,您可以将 CRT 文件 I/O API 与 Windows 句柄一起使用。只要去看源码就可以了。
It will likely be difficult to get protabiltiy with this kind of operation using the C Runtime LIbrary. You really need to use OS specific code for this kind of thing.
But, you may be able to get this to work by inspecting and understanding the underlying C Runtime Library implimentations. The source code to both the GCC run times and the Microsofot run times come with the tools. Just go look and see how they are implimented.
Note that, on Windows, you can use the CRT file I/O APIs with Windows handles. Just go look at the source.
我会研究 XPDEV 特别是文件包装方法。他们实现了合理的跨平台锁定。
I would look into XPDEV specifically the file wrapper methods... they implement reasonable cross-platform locking.