调用fcntl()的目的是什么,文件描述符为-1,cmd为F_GETFL?

时间:2013-05-15 04:58:30

标签: c sockets unix freebsd fcntl

我试图理解这行代码的含义:

flags = fcntl(-1,F_GETFL,0);

3 个答案:

答案 0 :(得分:4)

使用F_GETFL标记调用fcntl()的通常原因是修改标记并使用fcntl()F_SETFL进行设置;使用fcntl()调用F_GETFL的另一个原因是找出文件描述符的特征。您可以通过阅读(相当仔细地)有关<fcntl.h>的信息来查找有关哪些标志可以操作的信息。标志包括:

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

Plus(POSIX 2008)O_ACCMODE,如果我正确读取引用的页面,则可用于区分O_RDONLYO_RDWRO_WRONLY

但是,使用fcntl()等明确无效的文件描述符调用-1毫无意义。所有发生的事情是函数返回-1表示失败并将errno设置为EBADF(错误的文件描述符)。

答案 1 :(得分:3)

假设我们正在谈论man 2 fcntl描述的功能:

flags = fcntl(-1,F_GETFL,0);

尝试对无效的文件描述符(-1)执行某些操作,因此永远不会做任何其他事情,但会返回-1并将errno设置为{ {1}}。

我会说你可以通过以下方式保存替换此行:

EBADF

答案 2 :(得分:0)

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不是有效的文件描述符。 valid file descriptors0开始。 (即perror()打印错误消息Bad file descriptor,EBADF)

注意:我在Linux系统中运行此代码。

修改
F_GETFL用于fcntl()中的GET标志命令。