我试图理解这行代码的含义:
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) 执行某些操作,因此除了返回并设置为. 之外永远不会做任何其他事情。-1errnoEBADF
我会说您可以通过以下方式轻松替换此行:
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 命令。