Lar*_*rry 3 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));
Run Code Online (Sandbox Code Playgroud)
它输出:
2
2050
Run Code Online (Sandbox Code Playgroud)
但是我的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
....
Run Code Online (Sandbox Code Playgroud)
即使采用按位操作,我也无法理解我最终得到的2050或2.
有人为我清理道路吗?
04000
(带前导零)是一个八进制整数文字,和
2 (decimal) = 2 (octal) = O_RDWR
2050 (decimal) = 4002 (octal) = O_RDWR | O_NONBLOCK
Run Code Online (Sandbox Code Playgroud)
这意味着设置O_NONBLOCK
标志工作正常.
为了便于与O_XXX
定义进行比较,您可以将标志打印为八进制数:
printf("FD MODE 2 - %#o\n", fcntl(sfd,F_GETFL));
// Output: FD MODE 2 - 04002
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
543 次 |
最近记录: |