我正在编写一个应用程序及其在规范中,我每次写入它时都需要锁定文件(该文件将用于其他团队正在处理的其他应用程序):

我做出了以下功能:

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 */
有帮助吗?

解决方案

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

其他提示

当第一个过程存在并且其文件描述符全部关闭时,锁定锁定。

编辑: 我想我误解了测试方案 - 一个 popen() 呼叫不会遵循锁定协议(仅是建议,而不是由OS强制执行),因此即使调用的过程也会发生写入 lock_file() 仍然存在并持有锁。

除了吉姆说的话 fcntl 锁是 咨询. 。他们是这样 不是 防止任何人打开并写入文件。他们唯一要做的就是防止其他过程获取自己的 fcntl 锁。

如果您将所有作者控制到文件,这很好,因为您只能让每个作家尝试先锁定文件。否则你就可以了。 UNIX不提供任何“强制性”锁(引起锁的锁 open 或者 write 失败)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top