我写了一个简单的代码来测试flock():
int main (int argc, char * const argv[]) {
int fd1;
if (fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1)
{
perror("Cannot open file 1.\n");
fflush(stdout);
}
else
{
printf("file opened 1.\n");
fflush(stdout);
}
if(flock(fd1,LOCK_EX)==0)
{
printf("THE FILE WAS LOCKED 1.\n");
}
else if(errno == EACCES)
{
printf("The file is locked 1.\n");
}
std::cout<<"Enter any key:"<<std::endl;
std::cin >> input;
close(fd1);
std::cout<<"Lock was released."<<std::endl;
return 0;
}
当我两次运行可执行文件'Alex'时:
第一个过程:
$ ./Alex
file opened 1.
THE FILE WAS LOCKED 1.
Enter any key:
第二个过程:
$ ./Alex
file opened 1.
THE FILE WAS LOCKED 1.
Enter any key:
在活动监视器中,我看到两个具有两个不同PID的Alex实例。
似乎flock()不起作用。我错过了什么?谢谢!
答案 0 :(得分:1)
尝试:
if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC)) == -1)
// ^ ^
正如你所写的那样:
if (open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1)
fd1 = TRUE;
else
fd1 = FALSE;
因此,您试图锁定stdin
或stdout
(取决于open()
的结果)。
答案 1 :(得分:1)
你的行
if (fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1)
有2个错误
您正在将open( "file1", O_RDWR | O_CREAT | O_TRUNC) == -1
的结果分配给fd1
,这可能是假(0),因此您将0传递给flock()。使用
if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC)) == -1)
将O_CREAT标志传递给open时,需要传入3.参数中的权限,例如。
if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1)