如何检查文件是否被锁定?

时间:2014-02-20 19:45:32

标签: c file locking fcntl

我有以下代码,我想检查文件是否被锁定。如果没有,那么我想写信给它。我通过在两个终端上同时运行它来运行此代码,但我总是被锁定#34;状态每次都在两个标签中,即使我还没有锁定它。代码如下:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    struct flock fl,fl2;
    int fd;

    fl.l_type   = F_WRLCK;  /* read/write lock */
    fl.l_whence = SEEK_SET; /* beginning of file */
    fl.l_start  = 0;        /* offset from l_whence */
    fl.l_len    = 0;        /* length, 0 = to EOF */
    fl.l_pid    = getpid(); /* PID */

    fd = open("locked_file", O_RDWR | O_EXCL | O_CREAT);
    fcntl(fd, F_GETLK, &fl2);
    if(fl2.l_type!=F_UNLCK)
    {
        printf("locked");
    }
    else
    {
        fcntl(fd, F_SETLKW, &fl); /* set lock */
        write(fd,"hello",5);
        usleep(10000000);
    }
    printf("\n release lock \n");

    fl.l_type   = F_UNLCK;
    fcntl(fd, F_SETLK, &fl); /* unset lock */
}

2 个答案:

答案 0 :(得分:4)

非常简单,只需使用F_GETLK而不是F_SETLK运行fnctl。这将把你指针的数据设置为锁的当前状态,你可以通过访问l_type属性来查找它是否被锁定。

请参阅:http://linux.die.net/man/2/fcntl了解详情。

答案 1 :(得分:1)

您还需要fl2memset为0.否则当您在失败时使用fcntl(fd, F_GETLK, &fl2)perror时,您会在终端上看到相应的消息:

  

fcntl:无效的辩论

我建议您在调试系统调用时使用perror