带F_设置的fcntl

带F_设置的fcntl,c,posix,C,Posix,问题:当使用F_SETLK调用时,fcntl函数的第三个参数的含义是什么 检查fcntl的手册页,我发现第三个参数应该是指向结构的指针。我假设手册中提到的是这种情况: fcntl(fd, F_SETLK, *fl) 在gogole搜索中,我发现了许多使用fcntl的实际示例,如下所示: FCNTL(fd, F_SETLK, &fl) 我对这个问题的正确答案有点困惑。根据手册: 整数fcntl(整数fd,整数cmd,…/*arg*/) fcntl()可以接受可选的第三个参数。是否需要

问题:当使用F_SETLK调用时,fcntl函数的第三个参数的含义是什么

检查fcntl的手册页,我发现第三个参数应该是指向结构的指针。我假设手册中提到的是这种情况:

fcntl(fd, F_SETLK, *fl)
在gogole搜索中,我发现了许多使用fcntl的实际示例,如下所示:

FCNTL(fd, F_SETLK, &fl)

我对这个问题的正确答案有点困惑。

根据手册:

整数fcntl(整数fd,整数cmd,…/*arg*/)

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

F_SETLK(结构群集*)


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

根据手册页:

整数fcntl(整数fd,整数cmd,…/*arg*/)

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

F_SETLK(结构群集*)


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

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

FCNTL(fd, F_SETLK, &fl);
标志
F_SETLK
是释放一个建议锁(先前已获取),而指针
fl
是一个结构变量,声明如下:

struct flock fl;
当手册上说:

第三个参数lock是指向至少 至少以下[…]

如果
fl
被声明为:
struct flock fl
然后
&fl
生成一个指针,fnctl调用如下所示:

FCNTL(fd, F_SETLK, &fl);
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(fd, F_SETLK, fl);

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

您发现的示例具有正确的用法:

FCNTL(fd, F_SETLK, &fl);
标志
F_SETLK
是释放一个建议锁(先前已获取),而指针
fl
是一个结构变量,声明如下:

struct flock fl;
当手册上说:

第三个参数lock是指向至少 至少以下[…]

如果
fl
被声明为:
struct flock fl
然后
&fl
生成一个指针,fnctl调用如下所示:

FCNTL(fd, F_SETLK, &fl);
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(fd, F_SETLK, fl);
您可能应该阅读更多关于指针的信息,并理解它们,因为这是您问题的中心问题,而不是fcntl。

没有提到fcntl(fd,F_SETLK,*fl),除此之外,它还有这样一句话要说

第三个参数lock是指向结构的指针

F_SETLK(结构群集*) 获取锁(当l_type为F_RDLCK或F_WRLCK时)或释放锁(当l_type为F_UNLCK时),锁定由 l_从哪里开始,l_开始,l_锁定字段。 如果另一个进程持有冲突锁,则此调用返回-1并将errno设置为EACCES或EAGAIN

现在,fcntl()的原型是

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

这意味着对于
cmd
F_SETLK
您将指向
struct flock
的指针传递为3。论点如果您有一个
struct flock fl
,您可以通过执行
&fl

e、 g

代码中没有提到fcntl(fd,F_SETLK,*fl),除此之外,它还有这样的说法

第三个参数lock是指向结构的指针

F_SETLK(结构群集*) 获取锁(当l_type为F_RDLCK或F_WRLCK时)或释放锁(当l_type为F_UNLCK时),锁定由 l_从哪里开始,l_开始,l_锁定字段。 如果另一个进程持有冲突锁,则此调用返回-1并将errno设置为EACCES或EAGAIN

现在,fcntl()的原型是

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

这意味着对于
cmd
F_SETLK
您将指向
struct flock
的指针传递为3。论点如果您有一个
struct flock fl
,您可以通过执行
&fl

e、 g


“符号化”不是一个词。。。你是说“规范”吗?我编辑了我的帖子。我想说“意义”,“符号化”不是一个词。。。你是说“规范”吗?我编辑了我的帖子。我想说“意义”。