0

我在我的 ubuntu 机器上执行了以下 c 代码...我已经阅读了有关 fcntl() 用于锁定文件的信息,如果设置了 F_WRLCK 选项,则甚至不允许读取...所以我在放弃之前启动了这个程序通过按回车锁定我尝试以两种方式打开文件 - 直接双击 file1.cpp 并在新终端中运行不同的 c 程序...在打开文件的时间...那么如何fcntl() 允许在设置 F_WRLCK 时打开这些文件...

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

struct flock fl = {F_WRLCK, SEEK_SET,   0,      0,     0 };
int fd;

fl.l_pid = getpid();

if ((fd = open("/home/file1.cpp", O_WRONLY)) == -1)
{
    perror("open");
    exit(1);
}


if (fcntl(fd, F_SETLKW, &fl) == -1) 
{
    perror("fcntl");
    exit(1);
}


printf("Press <RETURN> to release lock: ");
getchar();

fl.l_type = F_UNLCK;  /* set to unlock same region */

if (fcntl(fd, F_SETLK, &fl) == -1)
{
    perror("fcntl");
    exit(1);
}

printf("Unlocked.\n");

close(fd);

return 0;
}
4

1 回答 1

0

fcntl锁是纯粹的咨询锁。它们的唯一fcntl F_SETLK作用是在无法获得锁时导致调用阻塞。它们对 IO 操作绝对没有影响。当需要同步时,由您的程序在执行 IO 之前获取所需的锁。

这完全类似于使用互斥锁来保护内存中的对象。互斥锁不会阻止您读取或写入内存地址;它只是你用来确保你的程序只读写和正确时间的协议。

于 2012-06-16T11:15:47.123 回答