fcntl()和F_GETFL:奇怪的结果

时间:2014-05-01 17:16:50

标签: c sockets file-descriptor

上下文

我是一名自学者,今天我的第一个套接字使用c代码。 高兴。

问题

假设我们有sfd,一个套接字文件描述符。

执行此代码时:

flags = fcntl (sfd, F_GETFL, 0);
printf("FD MODE 1 - %d\n",fcntl(sfd,F_GETFL));
flags |= O_NONBLOCK;
s = fcntl (sfd, F_SETFL, flags);
printf("FD MODE 2 - %d\n",fcntl(sfd,F_GETFL));

输出:

2
2050

但是我的fcntl-linux.h说:

...
/* open/fcntl.  */
#define O_ACCMODE      0003
#define O_RDONLY         00
#define O_WRONLY         01
#define O_RDWR           02
#ifndef O_CREAT
# define O_CREAT       0100 /* Not fcntl.  */
#endif
#ifndef O_EXCL
# define O_EXCL        0200 /* Not fcntl.  */
#endif
#ifndef O_NOCTTY
# define O_NOCTTY      0400 /* Not fcntl.  */
#endif
#ifndef O_TRUNC
# define O_TRUNC      01000 /* Not fcntl.  */
#endif
#ifndef O_APPEND
# define O_APPEND     02000
#endif
#ifndef O_NONBLOCK
# define O_NONBLOCK   04000
....

问题

即使采用按位操作,我也无法理解我最终得到的2050或2。

有人为我清理道路吗?

1 个答案:

答案 0 :(得分:5)

04000(前导零)是八进制整数文字,

   2 (decimal) =    2 (octal) = O_RDWR
2050 (decimal) = 4002 (octal) = O_RDWR | O_NONBLOCK

这意味着设置O_NONBLOCK标志工作正常。

为了便于与O_XXX定义进行比较,您可以将标记打印为 八进制数:

printf("FD MODE 2 - %#o\n", fcntl(sfd,F_GETFL));
// Output: FD MODE 2 - 04002