【问题标题】:What is the purpose of calling fcntl() be called with the file descriptor as -1 and cmd as F_GETFL?调用 fcntl() 的目的是什么,文件描述符为 -1,cmd 为 F_GETFL?
【发布时间】:2013-05-09 13:27:47
【问题描述】:

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

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

【问题讨论】:

    标签: c sockets unix freebsd fcntl


    【解决方案1】:

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

    【讨论】:

    • 所以你的代码的目的只是表明-1不是一个有效的文件描述符:),如果你需要更多帮助,请告诉我。
    【解决方案2】:

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

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

    加上 (POSIX 2008) O_ACCMODE,然后可以用来区分 O_RDONLYO_RDWRO_WRONLY,如果我正确阅读了引用的页面。

    但是,使用绝对无效的文件描述符(例如 -1)调用 fcntl() 毫无意义。所发生的只是该函数返回-1 指示失败并将errno 设置为EBADF(错误的文件描述符)。

    【讨论】:

      【解决方案3】:

      假设我们谈论的是man 2 fcntl描述的函数:

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

      尝试对无效的文件描述符 (-1) 执行某些操作,因此将从不做任何其他事情,而是返回 -1 并将 errno 设置为 EBADF

      我想说你可以用以下方式替换这一行:

      flags = -1; errno = EBADF;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 2014-04-24
        • 1970-01-01
        • 2013-03-20
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        相关资源
        最近更新 更多