7

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

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

3 回答 3

4

fcntl()使用标志调用的通常原因F_GETFL是修改标志并使用 and 设置fcntl()它们F_SETFLfcntl()调用with的另一个原因F_GETFL是找出文件描述符的特征。您可以通过阅读(相当仔细地)有关<fcntl.h>. 标志包括:

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

加上(POSIX 2008)O_ACCMODE ,如果我正确阅读了引用的页面,则可以使用它来区分O_RDONLYO_RDWR和。O_WRONLY

但是,fcntl()使用绝对无效的文件描述符(例如-1. 所发生的只是函数返回-1指示失败并设置errnoEBADF(错误的文件描述符)。

于 2013-05-15T06:16:56.867 回答
3

假设我们正在讨论由 描述的功能man 2 fcntl

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

尝试对无效的文件描述符 ( -1) 执行某些操作,因此除了返回并设置为. 之外永远不会做任何其他事情-1errnoEBADF

我会说您可以通过以下方式轻松替换此行:

flags = -1; errno = EBADF;
于 2013-05-15T07:08:02.997 回答
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它不是有效的文件描述符。并且有效的文件描述符0. (这就是perror()打印错误消息 Bad file descriptor , EBADF 的内容)

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

编辑
F_GETFL用于 fcntl() 中的 GET flags 命令。

于 2013-05-15T05:40:16.353 回答