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.

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 */;"

它显示出 arg 是不需要 F_GETFD (今天)。然后说:

Arg值F_GETFD,F_SETFD,F_GETFL,并F_SETFL所有代表 标志的价值观,以允许对未来的增长。

它意味着 F_GETFL 可能使用 arg 在未来?

快速搜索"F_GETFL"在Ohloh代创造一个印象, 大多数开放源码项目的做过 arg(通常 0, 有时 NULL, 或甚至(坏了吗?) &fl).我不明白为什么 fcntl(fd, F_GETFL, 0) 是优选形式。 @狮头象问:Wumbley建议 它可能造成的 "先进的节目编UNIX环境"的书 这还使用 fcntl(fd, F_GETFL, 0) 形式。

是否有一个系统/编译器,需要第3arg: flags = fcntl(fd, F_GETFL, 0);?可以 fcntl(fd, F_GETFL)fcntl(fd, F_GETFL, 0) 产生不同的结果今天或在今后的(假定一个符合执行)?

有帮助吗?

解决方案

看看休息的fcntl命令。通知如何他们中的一些(F_DUPFD,F_SETFL,和其他人)告诉你什么是第三arg用。你需要提供第三arg当使用其中的一个。不当使用F_GETFL或F_GETFD.

在该大纲可以看到,fcntl需要2参加一个 ... 这意味着第三arg可以省去的时候它不会被使用。

之后做了一些更多的研究,我发现,有一些古老的男人的网页(从四周时间的第一APUE)在其简介意味着所有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);

我找不到任何证据证明它曾经是实际上宣布的方式在标题,但如果它是的,然后汇编将会失败,当时它被称为只有2个论点。这将是一个很好的理由包括额外的0论在你的代码。

如果我的猜测是正确的,这是实际的原因使用的历史3-arg F_GETFL然后这是一个无用的化石从当时的功能原型新的和可怕的和操作系统供应商,让他们错误的。

其他提示

在FreeBSD库系统,既 fcntl(fd, F_GETFL)fcntl(fd, F_GETFL, 0) 使用。但在大多数情况下的第三个论点是0使用。这可能是由于历史的原因以来 fcntl 可以追溯到4.2BSD,并且进口到FreeBSD通过的4.4BSD-Lite源代码。

4.4BSD(和FreeBSD2.0),该手册页列出的参数为 强制性的: int fcntl(int fd, int cmd, int arg), 虽然实际老头不会 : int fcntl(int, int, ...).

作为的 为什么, 那将是困难的答案。我们必须问问原作者(s)。但是,由于没有(用户)的名字记录在原始来源的控制标签,我也不知道如何跟踪他们。

额外的0论点是可能永远不会除去FreeBSD代码,因为它不会破坏任何东西,因此不是重要的,足以"修复"。

这两个电话

flags = fcntl(fd, F_GETFL);
flags = fcntl(fd, F_GETFL, 0);

是等同的,因为第三个可变的参数被忽略。如果你看一看 fs/fcntl.c:262fs/fcntl.c:269 你会看到 arg 是没有用的。
然而,当你需要设置一些值,则应该通过价值要设置。
你可以考虑 fcntl 作为面向对象相当的吸气,并制定者。

是有一个系统,需要对第3arg:flags=fcntl(fd,F_GETFL,0);?

我不知道有任何.Linux不,至少。该文件明确指出,这忽略,因为将没有用的 arg.事实上,你可以穿的东西并不意味着你必须要.

可以 fcntl(fd, F_GETFL)fcntl(fd, F_GETFL, 0) 返回不同的结果,对一些系统(过去、今天和未来(假设符合执行))?

lxr 可以让我们深入挖掘旧版本的Linux和甚至在1991年,与Linux2.0.4, fcntl 通过第三个参数。没有意义接受任何进一步的参数。因此,如果有一个系统,在那里,第三个论点都有意义,它不是Linux。


我已经做了一些进一步的研究和我发现一些相互矛盾的结果。看看 在这里,:有一些书籍(我不后一个直接链接到他们,因为他们可能是 protected)哪些提议 fcntl 作为三个参数的功能。但是,至少有关 GETFL/GETFD, 没有提到是完成有关 arg.
恕我直言,它的行为从来没有认真对待:这是什么让你知道。此外,我甚至可以考虑它有害使用,第三个论点:什么如果它不会/将会有一个意思?

我已经走过了Linux再次和第三个参数对于那些命令是从来没有通过。

最后

是否有一个系统/编译器,需要第3arg:flags=fcntl(fd,F_GETFL,0);?可以fcntl(fd,F_GETFL)和fcntl(fd,F_GETFL,0)产生不同的结果今天或在今后的(假定一个符合执行)?

未来就是神秘。今天,我感到足够确定排除的。然而,过去它 可能会 已经如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top