flock()不会阻止其他进程获得独占锁

时间:2014-11-12 13:58:13

标签: c macos file-locking flock

我写了一个简单的代码来测试flock():

int main (int argc, char * const argv[]) {

    int fd1;

    if (fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1)
    {
        perror("Cannot open file 1.\n");
        fflush(stdout);
    }
    else
    {
        printf("file opened 1.\n");
        fflush(stdout);
    }

    if(flock(fd1,LOCK_EX)==0)
    {
        printf("THE FILE WAS LOCKED 1.\n");
    }
    else if(errno == EACCES)
    {
        printf("The file is locked 1.\n");
    }

    std::cout<<"Enter any key:"<<std::endl;
std::cin >> input;

    close(fd1);
    std::cout<<"Lock was released."<<std::endl;

    return 0;
}

当我两次运行可执行文件'Alex'时:

第一个过程:

$ ./Alex 
file opened 1.
THE FILE WAS LOCKED 1.
Enter any key:

第二个过程:

$ ./Alex 
file opened 1.
THE FILE WAS LOCKED 1.
Enter any key:

在活动监视器中,我看到两个具有两个不同PID的Alex实例。

似乎flock()不起作用。我错过了什么?谢谢!

2 个答案:

答案 0 :(得分:1)

尝试:

if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC)) == -1)
//  ^                                                ^

正如你所写的那样:

if (open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1)
    fd1 = TRUE;
else
    fd1 = FALSE;

因此,您试图锁定stdinstdout(取决于open()的结果)。

答案 1 :(得分:1)

你的行

if (fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1)

有2个错误

  1. 您正在将open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1的结果分配给fd1,这可能是假(0),因此您将0传递给flock()。使用

    if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC)) == -1)

  2. 将O_CREAT标志传递给open时,需要传入3.参数中的权限,例如。

    if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1)