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
?
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 ...