gpt4 book ai didi

c - 什么时候需要 F_GETFL fcntl 命令的参数?

转载 作者:IT王子 更新时间:2023-10-29 00:57:18 26 4
gpt4 key购买 nike

int fcntl(int fd, int command, ... /* arg */ );

是否可移植:flags = fcntl(fd, F_GETFL);(注意:没有arg)?

两者都是LinuxFreeBSD手册页说 arg 被忽略:

F_GETFL (void)
Get the file access mode and the file status flags; arg
is ignored.
Linux 文档中的

void 表示不需要 arg

这是一个 usage example from POSIX for a related F_GETFD flag :

#include <unistd.h>
#include <fcntl.h>
...
int flags;


flags = fcntl(fd, F_GETFD);
if (flags == -1)
/* Handle error */;
flags |= FD_CLOEXEC;
if (fcntl(fd, F_SETFD, flags) == -1)
/* Handle error */;"

它表明arg 不是F_GETFD(今天)所必需的。然后它说:

The arg values to F_GETFD, F_SETFD, F_GETFL, and F_SETFL all represent flag values to allow for future growth.

这是否意味着 F_GETFL 将来可能会使用 arg

在 Ohloh 代码上快速搜索“F_GETFL”给人的印象是 most open-source projects do pass arg (通常是 0,有时是 NULL,甚至(损坏?)&fl)。我不明白为什么 fcntl(fd, F_GETFL, 0) 是首选形式。 @Wumpus Q. Wumbley suggests这可能是由 "Advanced Programming in the UNIX Environment" book 引起的也使用 fcntl(fd, F_GETFL, 0) 形式。

是否有系统/编译器需要第三个参数:flags = fcntl(fd, F_GETFL, 0);fcntl(fd, F_GETFL)fcntl(fd, F_GETFL, 0) 能否在今天或将来产生不同的结果(假设实现兼容)?

最佳答案

查看其余的 fcntl 命令。请注意它们中的一些(F_DUPFD、F_SETFL 和其他)如何告诉您第三个 arg 的用途。使用其中一个时,您需要提供第三个参数。在使用 F_GETFL 或 F_GETFD 时不是。

在 SYNOPSIS 中,您可以看到 fcntl 有 2 个参数加上一个 ...,这意味着第三个参数在不使用时可以省略。

在做了更多研究之后,我发现有一些旧的手册页(大约在第一个 APUE 出现的时候),其中 SYNOPSIS 暗示所有 3 个参数都是必需的。示例:http://www.freebsd.org/cgi/man.cgi?query=fcntl&manpath=FreeBSD+2.2.7-RELEASE

SYNOPSIS
#include <fcntl.h>

int
fcntl(int fd, int cmd, int arg);

我找不到任何证据表明它实际上曾在 header 中以这种方式声明,但如果是这样,那么当仅使用 2 个参数调用它时编译将失败。这是在您的代码中包含额外的 0 参数的一个很好的理由。

如果我的猜测是正确的,并且这是历史上使用 3-arg F_GETFL 的实际原因,那么它是一个无用的化石,因为函数原型(prototype)是新的和可怕的,操作系统供应商把它们弄错了。

关于c - 什么时候需要 F_GETFL fcntl 命令的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com