我是一名自学者,今天我的第一个套接字使用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。
有人为我清理道路吗?
答案 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