首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有F_SETLK的fcntl

带有F_SETLK的fcntl
EN

Stack Overflow用户
提问于 2014-05-21 19:05:42
回答 3查看 4.1K关注 0票数 1

问:使用F_SETLK调用fcntl函数的第三个参数的意义是什么?

我在检查fcntl的手册页时发现,第三个参数应该是指向结构的指针。我认为手册中提到的是这个案例:

代码语言:javascript
复制
fcntl(fd, F_SETLK, *fl)

在gogole搜索中,我发现了许多使用fcntl的实用示例如下:

代码语言:javascript
复制
FCNTL(fd, F_SETLK, &fl)

我有点搞不懂这个问题的正确答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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()的原型是

代码语言:javascript
复制
  int fcntl(int fd, int cmd, ... /* arg */ );

这是一个变量参数函数。在2参数中传递的命令确定了变量参数需要传递的内容。

这意味着对于cmd F_SETLK,您将一个指向struct flock的指针作为3.参数传递。如果您有一个struct flock fl,则通过执行&fl获得一个指向它的指针。

例如:

代码语言:javascript
复制
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
}
票数 2
EN

Stack Overflow用户

发布于 2014-05-21 19:25:05

您找到的示例具有正确的用法:

代码语言:javascript
复制
FCNTL(fd, F_SETLK, &fl);

标志F_SETLK是释放一个咨询锁(以前获得的),而指针fl是一个结构变量,声明如下:

代码语言:javascript
复制
struct flock fl;

您可能会对指针是什么感到困惑,因为手册中说:

第三个参数,lock,是指向结构的指针,该结构至少具有以下内容.

如果fl声明为:struct flock fl;,那么&fl将生成一个指针,fnctl调用如下所示:

代码语言:javascript
复制
FCNTL(fd, F_SETLK, &fl);

如果fl被宣布为:

代码语言:javascript
复制
struct flock *fl; // fl is a pointer to struct flock
fl = malloc( sizeof (struct flock) ); // allocate memory

然后,fl是一个指针,fcntl调用如下所示:

代码语言:javascript
复制
FCNTL(fd, F_SETLK, fl);

您可能应该更多地阅读有关指针的内容,并理解它们,因为这是您问题中的中心问题,而不是fcntl。

票数 4
EN

Stack Overflow用户

发布于 2014-05-21 19:24:51

根据手册页:

int fcntl(int,int,. /* arg */ ); ..。 fcntl()可以使用可选的第三个参数。是否需要此参数由cmd决定。所需的参数类型在每个cmd名称之后的括号中表示(在大多数情况下,所需的类型是int,我们使用名称arg标识参数),如果不需要参数,则指定void。 ..。 F_SETLK (struct *)

cmdF_SETLK时,需要第三个参数,它是指向flock结构的指针。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23791740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档