我在我的ubuntu机器上执行了以下c代码...我已经阅读了fcntl()用于锁定文件的内容,并且如果设置了F_WRLCK opton ,则不允许读取。 ..所以我开始这个程序和放弃锁之前按Enter键我尝试以两种方式打开文件 - 直接双击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;
}
答案 0 :(得分:0)
fcntl
锁是纯粹的咨询锁。它们的唯一效果是在无法获取锁定时导致fcntl
F_SETLK
调用阻止。它们对IO操作完全没有影响。在需要同步时,需要在执行IO之前获取所需的锁定。
这完全类似于使用互斥锁来保护内存中的对象。互斥锁不会阻止您读取或写入内存地址;它只是一个协议,用于确保您的程序只能读写和适当的时间。