2014-05-01 45 views
2

語境

我是一個自我學習,我得到了我的第一個插座今天的工作與C語言代碼。 很高興。的fcntl()和F_GETFL:奇怪的結果

問題

假設我們有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 
.... 

問題

即使按位操作I c無辜得到我怎麼終於得到2050或2.

任何人爲我清除路徑?

+1

吹毛求疵:不要把它稱爲「腳本」,但只是「代碼」。然而,一個精心製作的問題:1+ – alk

+0

謝謝alk!我現在糾正它:) – Larry

回答

4

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 
+0

謝謝馬丁我錯過了八進制符號! :) – Larry