unix系统中使用c和fcntl的文件锁定



我正在努力学习在unix中编程c。因此,我阅读了Beejs指南,并试图了解更多关于文件锁定的信息。

所以我只是从他那里拿了一些Code的例子,试图读出文件是否被锁定,但每次都会得到代表无效参数的errno 22。因此,我检查了代码中的无效参数,但找不到它们。有人能帮我吗?

我的错误发生在:

        if( fcntl(fd, F_GETLK, &fl2) < 0 ) {
            printf("Error occured!n");
        }

完整代码:

    /*
    ** lockdemo.c -- shows off your system's file locking.  Rated R.
    */
    #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 };
        struct flock fl2;
        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");
        printf("Press <RETURN> to check lock: ");
        getchar();
        if( fcntl(fd, F_GETLK, &fl2) < 0 ) {
            printf("Error occured!n");
        }
        else{
            if(fl2.l_type == F_UNLCK) {
                printf("no lockn");
            }
            else{
                printf("file is lockedn");
                printf("Errno: %dn", errno);
            }
        }
        close(fd);
        return 0;
    }

我刚刚添加了fl2和底部的部分。

fcntl(fd, F_GETLK, &fl2)获取第一个锁,该锁阻止了fl2中的锁描述,并用该信息覆盖fl2。(比较fcntl-文件控制(

这意味着您必须将fl2初始化为有效的struct flock然后调用CCD_ 8。

相关内容

  • 没有找到相关文章

最新更新