1

我正在编写一个应用程序及其规范,我每次在其上写入时都需要锁定一个文件(该文件将为其他团队正在开发的其他应用程序读取):

我做了以下功能:

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 */
4

3 回答 3

5

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

于 2011-01-10T20:31:38.547 回答
2

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

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

于 2011-01-10T20:28:15.673 回答
0

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

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

于 2011-01-10T20:33:42.620 回答