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)?
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不需要.
#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的实际原因那么它就是一个无用的化石,从功能原型是新的和可怕的,操作系统供应商错误的时候.
| 归档时间: |
|
| 查看次数: |
5085 次 |
| 最近记录: |