2011-01-10 42 views
1

我正在写一个应用程序和它的规范中,我需要锁定 一个文件我每次写它(该文件将被读取其他团队正在工作的其他应用程序 上):C 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回(指一切正常),但是当我做了一个试验案例 我可能会在锁定的文件乌写

the te st代码是:

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

回答

5

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

+0

+1,我同意这真的是相关的问题。 – 2011-01-10 22:36:11

2

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

编辑:我想我误解了测试场景 - 一个popen()通话不会被下面的锁定协议(这是唯一的咨询,而不是由操作系统执行),所以发生写入即使过程那个叫lock_file()的东西依然存在,并且持有锁。

+0

虽然正确,但这里的问题可能是锁定咨询,正如AProgrammer提到的。 – nos 2011-01-10 21:17:20

+0

@nos:仔细看看OP的例子,我同意你的看法。我更新了我的答案。 – 2011-01-10 22:35:17

0

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

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