我正在努力学习在unix中编程c。因此,我阅读了Beejs指南,并试图了解更多关于文件锁定的信息。
所以我只是从他那里拿了一些Code的例子,试图读出文件是否被锁定,但每次都会得到代表无效参数的errno 22
。因此,我检查了代码中的无效参数,但找不到它们。有人能帮我吗?
我的错误发生在:
if( fcntl(fd, F_GETLK, &fl2) < 0 ) {
printf("Error occured!n");
}
完整代码:
/*
** lockdemo.c -- shows off your system's file locking. Rated R.
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
/* l_type l_whence l_start l_len l_pid */
struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 };
struct flock fl2;
int fd;
fl.l_pid = getpid();
if (argc > 1)
fl.l_type = F_RDLCK;
if ((fd = open("lockdemo.c", O_RDWR)) == -1) {
perror("open");
exit(1);
}
printf("Press <RETURN> to try to get lock: ");
getchar();
printf("Trying to get lock...");
if (fcntl(fd, F_SETLKW, &fl) == -1) {
perror("fcntl");
exit(1);
}
printf("got lockn");
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");
printf("Press <RETURN> to check lock: ");
getchar();
if( fcntl(fd, F_GETLK, &fl2) < 0 ) {
printf("Error occured!n");
}
else{
if(fl2.l_type == F_UNLCK) {
printf("no lockn");
}
else{
printf("file is lockedn");
printf("Errno: %dn", errno);
}
}
close(fd);
return 0;
}
我刚刚添加了fl2
和底部的部分。
fcntl(fd, F_GETLK, &fl2)
获取第一个锁,该锁阻止了fl2
中的锁描述,并用该信息覆盖fl2
。(比较fcntl-文件控制(
这意味着您必须将fl2
初始化为有效的struct flock
然后调用CCD_ 8。