linux中select 函式分析

2021-08-21 14:32:59 字數 2810 閱讀 8596

part 2:

trackback:

功能描述:根據檔案描述詞來操作檔案的特性。

用法:  

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_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:權能不允許

view plain

copy to clipboard

print

?

struct flock ;

struct flock ;

linux中select 函式分析

select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,...

Linux中select函式分析

select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣寫諸如connect accept recv或recvfrom這樣的阻塞程式 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果...

linux中select 函式分析

part 2 select 的機制中提供一fd set的資料結構,實際上是一long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd ...