用以下方法將socket設定為非阻塞方式
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
用以下方法將socket設定為非阻塞方式
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
將非阻塞的設定回阻塞可以用
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags & ~O_NONBLOCK);
功能描述:根據檔案描述詞來操作檔案的特性。
用法:
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
參數:
fd:檔案描述詞。
cmd:操作命令。
arg:供命令使用的參數。
lock:同上。
有以下操作命令可供使用
一. F_DUPFD :複製檔案描述詞 。
二. FD_CLOEXEC :設定close-on-exec標誌。如果FD_CLOEXEC位是0,執行execve的過程中,檔案保持開啟。反之則關閉。
三. F_GETFD :讀取檔案描述詞標誌。
四. F_SETFD :設定檔案描述詞標誌。
五. F_GETFL :讀取檔案狀態標誌。
六. F_SETFL :設定檔案狀態標誌。
其中O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY 和 O_TRUNC不受影響,
可以更改的標誌有 O_APPEND,O_ASYNC, O_DIRECT, O_NOATIME 和 O_NONBLOCK。
七. F_GETLK, F_SETLK 和 F_SETLKW :擷取,釋放或測試記錄鎖,使用到的參數是以下結構體指標:
F_SETLK:在指定的位元組範圍擷取鎖(F_RDLCK, F_WRLCK)或者釋放鎖(F_UNLCK)。如果與另一個進程的鎖操作發生衝突,返回 -1並將errno設定為EACCES或EAGAIN。
F_SETLKW:行為如同F_SETLK,除了不能擷取鎖時會睡眠等待外。如果在等待的過程中接收到訊號,會立即返回並將errno置為EINTR。
F_GETLK:擷取檔案鎖資訊。
F_UNLCK:釋放檔案鎖。
為了設定讀鎖,檔案必須以讀的方式開啟。為了設定寫鎖,檔案必須以寫的方式開啟。為了設定讀寫鎖,檔案必須以讀寫的方式開啟。
八. 訊號管理
F_GETOWN, F_SETOWN, F_GETSIG 和 F_SETSIG 被用於IO可擷取的訊號。
F_GETOWN:擷取當前在檔案描述詞 fd上接收到SIGIO 或 SIGURG事件訊號的進程或進程組標識 。
F_SETOWN:設定將要在檔案描述詞fd上接收SIGIO 或 SIGURG事件訊號的進程或進程組標識 。
F_GETSIG:擷取標識輸入輸出可進行的訊號。
F_SETSIG:設定標識輸入輸出可進行的訊號。
使用以上命令,大部分時間程式無須使用select()或poll()即可實現完整的非同步I/O。
九. 租約( Leases)
F_SETLEASE 和 F_GETLEASE 被用於當前進程在檔案上的租約。檔案租約提供當一個進程試圖開啟或折斷檔案內容時,擁有檔案租約的進程將會被通告的機制。
F_SETLEASE:根據以下符號值設定或者刪除檔案租約
1.F_RDLCK設定讀租約,當檔案由另一個進程以寫的方式開啟或折斷內容時,擁有租約的當前進程會被通告。
2.F_WRLCK設定寫租約,當檔案由另一個進程以讀或以寫的方式開啟或折斷內容時,擁有租約的當前進程會被通告。
3.F_UNLCK刪除檔案租約。
F_GETLEASE:擷取租約類型。
十.檔案或目錄改變通告
(linux 2.4以上)當fd索引的目錄或目錄中所包含的某一檔案發生變化時,將會向進程發出通告。arg參數指定的通告事件有以下,兩個或多個值可以通過或運算組合。
1.DN_ACCESS 檔案被訪問 (read, pread, readv)
2.DN_MODIFY 檔案被修改(write, pwrite,writev, truncate, ftruncate)
3.DN_CREATE 檔案被建立(open, creat, mknod, mkdir, link, symlink, rename)
4.DN_DELETE 檔案被刪除(unlink, rmdir)
5.DN_RENAME 檔案被重新命名(rename)
6.DN_ATTRIB 檔案屬性被改變(chown, chmod, utime[s])
返回說明:
成功執行時,對於不同的操作,有不同的傳回值
F_DUPFD: 新檔案描述詞
F_GETFD: 標誌值
F_GETFL: 標誌值
F_GETOWN: 檔案描述詞屬主
F_GETSIG: 讀寫變得可行時將要發送的通告訊號,或者0對於傳統的SIGIO行為
對於其它命令返回0。
失敗返回-1,errno被設為以下的某個值
EACCES/EAGAIN: 操作不被允許,尚未可行
EBADF: 檔案描述詞無效
EDEADLK: 探測到可能會發生死結
EFAULT: 鎖操作發生在可訪問的地址空間外
EINTR: 操作被訊號中斷
EINVAL: 參數無效
EMFILE: 進程已超出檔案的最大可使用範圍
ENOLCK: 鎖已被用盡
EPERM:權能不允許
struct flock {
short l_type; /* 鎖類型: F_RDLCK, F_WRLCK, F_UNLCK */
short l_whence; /* l_start欄位參照點: SEEK_SET(檔案頭), SEEK_CUR(檔案當前位置), SEEK_END(檔案尾) */
off_t l_start; /* 相對於l_whence欄位的位移量 */
off_t l_len; /* 需要鎖定的長度 */
pid_t l_pid; /* 當前獲得檔案鎖的進程標識(F_GETLK) */
};