FCNTL返回errno-参数无效

FCNTL返回errno-参数无效,c,unix,operating-system,fcntl,C,Unix,Operating System,Fcntl,我不明白为什么我的fcntl总是说“无效参数”。请帮忙。如果我理解正确,我应该用指向我要检查的字节的数据填充我的群(我传递给fcntl的那个) int byteno; printf(ANSI_COLOR_BLUE "Insert byte number: " ANSI_COLOR_RESET); scanf("%d\n", &byteno); struct flock* fl = malloc(sizeof(flock)); fl -> l_type = F_

我不明白为什么我的fcntl总是说“无效参数”。请帮忙。如果我理解正确,我应该用指向我要检查的字节的数据填充我的群(我传递给fcntl的那个)

  int byteno;
  printf(ANSI_COLOR_BLUE "Insert byte number: " ANSI_COLOR_RESET);
  scanf("%d\n", &byteno);

  struct flock* fl = malloc(sizeof(flock));
  fl -> l_type = F_GETLK;
  fl -> l_whence = SEEK_SET;
  fl -> l_start = byteno;
  fl -> l_len = 1;
  fl -> l_pid = getpid();

  if(fcntl(descr, F_GETLK, fl) == -1){
    perror(ANSI_COLOR_RED "Error while getting info about locks" ANSI_COLOR_RESET);
    free(fl);
    continue;
  }

  if(!(fl -> l_type == F_UNLCK)){
    printf(ANSI_COLOR_YELLOW "Other proccess has a lock here. PID = %d" ANSI_COLOR_RESET, fl -> l_pid);
    continue;
  }
F_GETLK(结构群集*)

在这个调用的输入上,lock描述了一个我们想要放置在文件上的锁如果可以放置锁,则fcntl()不会实际放置它,而是在lock的l_类型字段中返回F_UNLCK,并保持结构的其他字段不变。如果一个或多个不兼容的锁会阻止放置此锁,则fcntl()会返回l_类型中这些锁之一的详细信息,l_where,l_start,和lock的l_len字段,并将l_pid设置为持有该锁的进程的pid

F_GETLK
不用于获取有关锁的信息,而是用于“测试应用指定锁是否有效”

试试下面的例子。在5秒内运行两次

#包括
#包括
#包括
#包括
真空总管(真空){
int-fd;
结构flock fl_信息;
int ret;
fd=open(“./test.txt”,O|RDWR | O|u CREAT,0600);
如果(fd==-1){
perror(“open()”);
返回;
}
memset(&fl_info,0,sizeof(fl_info));
/*尝试获取整个文件的写锁(l_len==零)*/
fl_info.l_type=F_WRLCK;
fl_info.l_whence=搜索集;
fl_info.l_start=0;
fl_info.l_len=0;
ret=fcntl(fd、F_GETLK和fl_info);
如果(ret==-1){
perror(“fcntl(F_GETLK)”);
返回;
}
如果(fl_info.l_type!=F_UNLCK){
printf(“太糟糕了……它已经被pid=%d\n”锁定,fl\u info.l\u pid);
返回;
}
/*尝试应用写锁*/
fl_info.l_type=F_WRLCK;
ret=fcntl(fd、F_设置和fl_信息);
如果(ret==-1){
perror(“fcntl(F_SETLK)”);
返回;
}
printf(“成功!\n”);
睡眠(5);
printf(“我做完了,再见!\n”)
返回;
}

还请注意,对于
struct flock
,不需要
malloc()
存储

F_GETLK(结构群集*)

在这个调用的输入上,lock描述了一个我们想要放置在文件上的锁如果可以放置锁,则fcntl()不会实际放置它,而是在lock的l_类型字段中返回F_UNLCK,并保持结构的其他字段不变。如果一个或多个不兼容的锁会阻止放置此锁,则fcntl()会返回l_类型中这些锁之一的详细信息,l_where,l_start,和lock的l_len字段,并将l_pid设置为持有该锁的进程的pid

F_GETLK
不用于获取有关锁的信息,而是用于“测试应用指定锁是否有效”

试试下面的例子。在5秒内运行两次

#包括
#包括
#包括
#包括
真空总管(真空){
int-fd;
结构flock fl_信息;
int ret;
fd=open(“./test.txt”,O|RDWR | O|u CREAT,0600);
如果(fd==-1){
perror(“open()”);
返回;
}
memset(&fl_info,0,sizeof(fl_info));
/*尝试获取整个文件的写锁(l_len==零)*/
fl_info.l_type=F_WRLCK;
fl_info.l_whence=搜索集;
fl_info.l_start=0;
fl_info.l_len=0;
ret=fcntl(fd、F_GETLK和fl_info);
如果(ret==-1){
perror(“fcntl(F_GETLK)”);
返回;
}
如果(fl_info.l_type!=F_UNLCK){
printf(“太糟糕了……它已经被pid=%d\n”锁定,fl\u info.l\u pid);
返回;
}
/*尝试应用写锁*/
fl_info.l_type=F_WRLCK;
ret=fcntl(fd、F_设置和fl_信息);
如果(ret==-1){
perror(“fcntl(F_SETLK)”);
返回;
}
printf(“成功!\n”);
睡眠(5);
printf(“我做完了,再见!\n”)
返回;
}


还要注意的是,对于
struct flock

来说,不需要
malloc()
存储,点
和箭头
->
操作符绑定得非常紧密,不应该被空格包围。POSIX()说:
短l_类型
-类型的锁;F_RDLCK,F_WRLCK,F_unck。您提供的是F_GETLK;这是无效的。点
和箭头
->
运算符绑定非常紧密,不应被空格包围。POSIX()表示:
短l_类型
-锁类型;F_RDLCK,F_WRLCK,F_unck。您提供的是F_GETLK;这是无效的。好吧,但我仍然看不出这里的错误。我试图更改fl->l_type=F_SETLK,但它仍然没有运行。
l_type
需要设置为您想要应用的锁的类型。。。不适用于您希望执行的操作。看看我的例子-
fl_info.l_type=F_WRLCK非常感谢!它现在起作用了,我现在也明白了。好吧,但我仍然没有看到这里的错误。我试图更改fl->l_type=F_SETLK,但它仍然没有运行。
l_type
需要设置为您想要应用的锁的类型。。。不适用于您希望执行的操作。看看我的例子-
fl_info.l_type=F_WRLCK非常感谢!它现在起作用了,我现在也明白了。