调用fcntl()函数时,将文件描述符设置为-1,cmd参数设置为F_GETFL的目的是什么?(涉及IT技术)

7
我正在尝试理解这行代码的含义:

我正在尝试理解这行代码的含义:

flags = fcntl(-1,F_GETFL,0);
3个回答

4
通常使用F_GETFL标志调用fcntl()的原因是要使用fcntl()F_SETFL修改标志;使用F_GETFL调用fcntl()的另一个原因是查找文件描述符的特性。您可以通过仔细阅读有关<fcntl.h>的信息来了解哪些标志可以被操作。这些标志包括:

  • O_APPEND - 设置追加模式。
  • O_DSYNC - 根据同步I/O数据完整性完成写入。
  • O_NONBLOCK - 非阻塞模式。
  • O_RSYNC - 同步读取I/O操作。
  • O_SYNC - 根据同步I/O文件完整性完成写入。

此外(POSIX 2008),还可以使用O_ACCMODE来区分O_RDONLYO_RDWRO_WRONLY,如果我正确地阅读了参考页面。

然而,将fcntl()与明确无效的文件描述符(如-1)一起调用毫无意义。这只会导致函数返回-1表示失败,并将errno设置为EBADF(坏文件描述符)。


3
假设我们正在讨论由man 2 fcntl描述的函数:
flags = fcntl(-1,F_GETFL,0);

试图在一个无效的文件描述符(-1)上执行某些操作,因此将永远不会做其他任何事情,只会返回-1并将errno设置为EBADF

我建议你可以安全地用以下代码替换这行:

flags = -1; errno = EBADF;

0

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命令。


因此,您的代码的目的只是显示“-1”不是有效的文件描述符 :), 如果您需要更多帮助,请告诉我。 - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接