我试图理解这行代码的含义:
flags = fcntl(-1,F_GETFL,0);
fcntl()
使用标志调用的通常原因F_GETFL
是修改标志并使用 and 设置fcntl()
它们F_SETFL
;fcntl()
调用with的另一个原因F_GETFL
是找出文件描述符的特征。您可以通过阅读(相当仔细地)有关<fcntl.h>
. 标志包括:
加上(POSIX 2008)O_ACCMODE ,如果我正确阅读了引用的页面,则可以使用它来区分O_RDONLY
、O_RDWR
和。O_WRONLY
但是,fcntl()
使用绝对无效的文件描述符(例如-1
. 所发生的只是函数返回-1
指示失败并设置errno
为EBADF
(错误的文件描述符)。
假设我们正在讨论由 描述的功能man 2 fcntl
:
flags = fcntl(-1,F_GETFL,0);
尝试对无效的文件描述符 ( -1
) 执行某些操作,因此除了返回并设置为. 之外永远不会做任何其他事情。-1
errno
EBADF
我会说您可以通过以下方式轻松替换此行:
flags = -1; errno = EBADF;
该fcntl()
函数对打开的描述符执行各种操作。它的语法是:
int fcntl(int descriptor,
int command,
...)
阅读返回值:
-1
然后 fcntl()
没有成功。设置了 errno 全局变量以指示错误。这段代码:
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int main(){
int flags;
if((flags = fcntl(-1,F_GETFL,0)) < 0){
perror("fcntl: ");
}
printf("\n %d\n", flags);
}
输出是:
~$ gcc xx.c
~$ ./a.out
fcntl: : Bad file descriptor
-1
请注意,打印的 flags
值-1
表示调用不成功,fcntl(-1,F_GETFL,0);
因为-1
它不是有效的文件描述符。并且有效的文件描述符从0
. (这就是perror()
打印错误消息 Bad file descriptor , EBADF 的内容)
注意:我在 Linux 系统中运行此代码。
编辑:
F_GETFL
用于 fcntl() 中的 GET flags 命令。