C fcntl抽象函数不起作用

时间:2011-01-10 20:17:54

标签: c file-io locking popen fcntl

我正在编写一个应用程序及其在我需要锁定的规范中 每次我写一个文件(这个文件将被其他应用程序读取 其他团队正在努力):

我做了以下功能:

int lock_file (int fd)
{
    if (fd == -1)
        return -1;
    struct flock file_locker;
    file_locker.l_type = F_WRLCK;
    file_locker.l_whence = SEEK_SET;
    file_locker.l_start = 0;
    file_locker.l_len = 0; //lock the entire file

    int locked = fcntl(fd, F_SETLK, &file_locker);
    if (locked == -1){
        /*handle errors*/
        return 0;
    }
    return 1;
}

我可以获得1回报(意味着一切正常)但是我做了一个测试用例 我可以写入锁定的文件Oo

测试代码是:

char *file = "lock_test_ok";
int fd = open(file, O_RDWR);
int locked = lock_file(fd);
/* call popen and try write 'ERROR' in the file */

/* if the file contains ERROR, than fail */

3 个答案:

答案 0 :(得分:5)

在Unix中锁定是建议性的:只有测试锁的程序才会写入。 (有些提供强制锁定,但不是那种方式。通常涉及在锁定文件上设置特殊属性。)

答案 1 :(得分:2)

当第一个进程存在且其文件描述符全部关闭时,将释放锁。

编辑:我认为我误解了测试场景 - popen()调用不会遵循锁定协议(这只是建议,而不是操作系统强制执行),因此,即使调用lock_file()的进程仍然存在并持有锁,也会发生写入。

答案 2 :(得分:0)

除了吉姆所说的,fcntl锁是咨询。他们阻止任何人打开和写入文件。他们唯一做的就是阻止其他进程获取自己的fcntl锁。

如果您控制文件的所有编写者,这很好,因为您可以让每个编写者首先尝试锁定文件。否则你就被软管了。 Unix不提供任何“强制”锁(导致openwrite失败的锁)。