Windows 和 Linux 上的 C 文件锁定行为

发布于 2024-11-03 20:37:58 字数 2067 浏览 1 评论 0 原文

我正在研究下面的示例来了解 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;
}

您能帮忙解决这个问题吗?如果可能的话,请提供这些场景中可移植代码的指南吗?

I was looking into below examples for understanding files locking on windows and linux. The program 1 is working on both windows and linux with gcc.

But the second one is only working on Linux. Especially problem in winodws GCC is coming in the structure flock declaration. I dont know if I am missing any thing here. Also Even after I close and unlink the file in 1st example for the next run the file is not unlocked.

Program 1: Working on Windows with GCC

Source: 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");
}

Program 2: Working on Linux with GCC

Source: 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;
}

Can you please help with this and if possible provide guidelines for portable code in these scenarios?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧故 2024-11-10 20:37:58

使用 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.

这样的小城市 2024-11-10 20:37:58

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

I would look into XPDEV specifically the file wrapper methods... they implement reasonable cross-platform locking.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文