Linux C fcntl()函數詳解


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) 

1、F_SETLEASE 和 F_GETLEASE 被用於當前進程在文件上的租約。文件租約提供當一個進程試圖打開或折斷文件內容時,擁有文件租約的進程將會被通告的機制。 

2、F_SETLEASE:根據以下符號值設置或刪除文件租約 

  • F_RDLCK設置讀租約,當文件由另一個進程以寫的方式打開或折斷內容時,擁有租約的當前進程會被通告。 
  • F_WRLCK設置寫租約,當文件由另一個進程以讀或以寫的方式打開或折斷內容時,擁有租約的當前進程會被通告。 
  • F_UNLCK刪除文件租約。

3、F_GETLEASE:獲取租約類型。 

十、文件或目錄改動通告 

(linux 2.4以上)當fd索引的目錄或目錄中所包含的某一文件發生變化時,將會向進程發出通告。arg參數指定的通告事件有以下,兩個或多個值能通過或運算組合。 

  • DN_ACCESS 文件被訪問 (read, pread, readv) 
  • DN_MODIFY 文件被修改(write, pwrite,writev, truncate, ftruncate) 
  • DN_CREATE 文件被建立(open, creat, mknod, mkdir, link, symlink, rename) 
  • DN_DELETE 文件被刪除(unlink, rmdir) 
  • DN_RENAME 文件被重命名(rename) 
  • 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) */
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM