fcntl函數詳解

功能描述:根據文件描述詞來操做文件的特性。

用法:
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:權能不容許linux

相關文章
相關標籤/搜索