问:使用F_SETLK调用fcntl函数的第三个参数的意义是什么?
我在检查fcntl的手册页时发现,第三个参数应该是指向结构的指针。我认为手册中提到的是这个案例:
fcntl(fd, F_SETLK, *fl)在gogole搜索中,我发现了许多使用fcntl的实用示例如下:
FCNTL(fd, F_SETLK, &fl)我有点搞不懂这个问题的正确答案。
发布于 2014-05-21 19:28:51
手册页没有提到fcntl(fd, F_SETLK, *fl),它要说的是,除其他外。
第三个参数,锁,是指向结构的指针。 F_SETLK (struct *)获取锁(当l_type是F_RDLCK或F_WRLCK时),或者在l_whence、l_start和l_len字段指定的锁上释放锁(当l_type是F_UNLCK)。如果另一个进程持有冲突锁,则此调用返回-1并将errno设置为EACCES或EAGAIN。
现在,fcntl()的原型是
int fcntl(int fd, int cmd, ... /* arg */ );这是一个变量参数函数。在2参数中传递的命令确定了变量参数需要传递的内容。
这意味着对于cmd F_SETLK,您将一个指向struct flock的指针作为3.参数传递。如果您有一个struct flock fl,则通过执行&fl获得一个指向它的指针。
例如:
struct flock fl;
int rc;
memset(&fl, 0, sizeof fl);
//acquire a read lock
fl.l_type = FL_RDLCK;
//for the entire file
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0;
rc = fcntl(my_fd, F_SETLK, &fl);
if (rc == -1) {
perror("fcntl");
//deal with error
}发布于 2014-05-21 19:25:05
您找到的示例具有正确的用法:
FCNTL(fd, F_SETLK, &fl);标志F_SETLK是释放一个咨询锁(以前获得的),而指针fl是一个结构变量,声明如下:
struct flock fl;您可能会对指针是什么感到困惑,因为手册中说:
第三个参数,lock,是指向结构的指针,该结构至少具有以下内容.
如果fl声明为:struct flock fl;,那么&fl将生成一个指针,fnctl调用如下所示:
FCNTL(fd, F_SETLK, &fl);如果fl被宣布为:
struct flock *fl; // fl is a pointer to struct flock
fl = malloc( sizeof (struct flock) ); // allocate memory然后,fl是一个指针,fcntl调用如下所示:
FCNTL(fd, F_SETLK, fl);您可能应该更多地阅读有关指针的内容,并理解它们,因为这是您问题中的中心问题,而不是fcntl。
发布于 2014-05-21 19:24:51
根据手册页:
int fcntl(int,int,. /* arg */ ); ..。 fcntl()可以使用可选的第三个参数。是否需要此参数由cmd决定。所需的参数类型在每个cmd名称之后的括号中表示(在大多数情况下,所需的类型是int,我们使用名称arg标识参数),如果不需要参数,则指定void。 ..。 F_SETLK (struct *)
当cmd是F_SETLK时,需要第三个参数,它是指向flock结构的指针。
https://stackoverflow.com/questions/23791740
复制相似问题