我正在尝试理解这行代码的含义:
我正在尝试理解这行代码的含义:
flags = fcntl(-1,F_GETFL,0);
F_GETFL
标志调用fcntl()
的原因是要使用fcntl()
和F_SETFL
修改标志;使用F_GETFL
调用fcntl()
的另一个原因是查找文件描述符的特性。您可以通过仔细阅读有关<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,
...)
阅读关于 返回值(Return Value):
-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()
打印错误消息坏的文件描述符,EBADF)
注意:我在Linux系统中运行此代码。
编辑:
F_GETFL
用于fcntl()中的GET flags命令。