【发布时间】:2013-05-09 13:27:47
【问题描述】:
我试图理解这行代码的含义:
flags = fcntl(-1,F_GETFL,0);
【问题讨论】:
标签: c sockets unix freebsd fcntl
我试图理解这行代码的含义:
flags = fcntl(-1,F_GETFL,0);
【问题讨论】:
标签: c sockets unix freebsd fcntl
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 descriptors 从0 开始。 (这就是perror() 打印错误消息Bad file descriptor,EBADF)
注意:我在 Linux 系统中运行此代码。
编辑:F_GETFL 用于 fcntl() 中的 GET flags 命令。
【讨论】:
-1不是一个有效的文件描述符:),如果你需要更多帮助,请告诉我。
使用F_GETFL 标志调用fcntl() 的通常原因是修改标志并使用fcntl() 和F_SETFL 设置它们;用F_GETFL 调用fcntl() 的另一个原因是找出文件描述符的特征。您可以通过阅读(相当仔细地)有关<fcntl.h> 的信息来找到有关可以操作哪些标志的信息。标志包括:
加上 (POSIX 2008) O_ACCMODE,然后可以用来区分 O_RDONLY、O_RDWR 和 O_WRONLY,如果我正确阅读了引用的页面。
但是,使用绝对无效的文件描述符(例如 -1)调用 fcntl() 毫无意义。所发生的只是该函数返回-1 指示失败并将errno 设置为EBADF(错误的文件描述符)。
【讨论】:
假设我们谈论的是man 2 fcntl描述的函数:
flags = fcntl(-1,F_GETFL,0);
尝试对无效的文件描述符 (-1) 执行某些操作,因此将从不做任何其他事情,而是返回 -1 并将 errno 设置为 EBADF。
我想说你可以用以下方式替换这一行:
flags = -1; errno = EBADF;
【讨论】: