什么时候需要F_GETFL fcntl命令的arg?

jfs*_*jfs 4 c unix linux freebsd fcntl

int fcntl(int fd, int command, ... /* arg */ );
Run Code Online (Sandbox Code Playgroud)

它是便携的:( flags = fcntl(fd, F_GETFL);注意:不arg)?

双方的LinuxFreeBSD的手册页说arg被忽略:

F_GETFL (void)
    Get the file access mode and the file status flags; arg
    is ignored.
Run Code Online (Sandbox Code Playgroud)

void在Linux文档中意味着arg不需要.

以下是POSIX中相关F_GETFD标志用法示例:

#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 */;"
Run Code Online (Sandbox Code Playgroud)

它表明(今天)arg不需要F_GETFD.然后它说:

F_GETFD,F_SETFD,F_GETFL和F_SETFL的arg值都表示允许未来增长的标志值.

它是否暗示将来F_GETFL可能会使用arg

在Ohloh代码上快速搜索"F_GETFL"会产生一种印象,即大多数开源项目都会通过arg(通常0,有时NULL,甚至(损坏?)&fl).我不明白为什么fcntl(fd, F_GETFL, 0)是首选形式.@Wumpus Q.Wumbley认为它可能是由"UNIX环境中的高级编程"一书引起的,它也使用了fcntl(fd, F_GETFL, 0)表格.

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

小智 5

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

在概要中,您可以看到fcntl采用2个args加上a ...,这意味着当不使用时,第三个arg可以省略.

在做了一些更多的研究后,我发现有一些旧的手册页(从第一个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);
Run Code Online (Sandbox Code Playgroud)

我找不到任何证据表明它实际上已经在标题中声明了这种方式,但如果是这样的话,那么只用2个参数调用时编译就会失败.这将是在代码中包含额外0参数的一个很好的理由.

如果我的猜测是正确的,这是历史使用3-arg F_GETFL的实际原因那么它就是一个无用的化石,从功能原型是新的和可怕的,操作系统供应商错误的时候.