C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)
fcntl系統調用可以用來對已打開的文件描述符進行各種控制操作以改變已打開文件的的各種屬性
?
函數原型:
fcntl函數功能依據cmd的值的不同而不同。參數對應功能如下:
(1)F_DUPFD
與dup函數功能一樣,復制由fd指向的文件描述符,調用成功后返回新的文件描述符,與舊的文件描述符共同指向同一個文件。
(2)F_GETFD
讀取文件描述符close-on-exec標志
(3)F_SETFD
將文件描述符close-on-exec標志設置為第三個參數arg的最后一位
(4)F_GETFL
獲取文件打開方式的標志,標志值含義與open調用一致
(5)F_SETF
設置文件打開方式為arg指定方式
?
文件記錄鎖是fcntl函數的主要功能。
記錄鎖:實現只鎖文件的某個部分,并且可以靈活的選擇是阻塞方式還是立刻返回方式
當fcntl用于管理文件記錄鎖的操作時,第三個參數指向一個struct flock *lock的結構體
?
short_l_type用來指定設置共享鎖(F_RDLCK,讀鎖)還是互斥鎖(F_WDLCK,寫鎖).
當short_l_type的值為F_UNLCK時,傳入函數中將解鎖。
每個進程可以在該字節區域上設置不同的讀鎖。
但給定的字節上只能設置一把寫鎖,并且寫鎖存在就不能再設其他任何鎖,且該寫鎖只能被一個進程單獨使用。
這是多個進程的情況。
單個進程時,文件的一個區域上只能有一把鎖,若該區域已經存在一個鎖,再在該區域設置鎖時,新鎖會覆蓋掉舊的鎖,無論是寫鎖還時讀鎖。
l_whence,l_start,l_len三個變量來確定給文件上鎖的區域。
l_whence確定文件內部的位置指針從哪開始,l_star確定從l_whence開始的位置的偏移量,兩個變量一起確定了文件內的位置指針先所指的位置,即開始上鎖的位置,然后l_len的字節數就確定了上鎖的區域。
特殊的,當l_len的值為0時,則表示鎖的區域從起點開始直至最大的可能位置,就是從l_whence和l_start兩個變量確定的開始位置開始上鎖,將開始以后的所有區域都上鎖。
為了鎖整個文件,我們會把l_whence,l_start,l_len都設為0。
(6)F_SETLK
此時fcntl函數用來設置或釋放鎖。當short_l_type為F_RDLCK為讀鎖,F_WDLCK為寫鎖,F_UNLCK為解鎖。
如果鎖被其他進程占用,則返回-1;
這種情況設的鎖遇到鎖被其他進程占用時,會立刻停止進程。
(7)F_SETLKW
此時也是給文件上鎖,不同于F_SETLK的是,該上鎖是阻塞方式。當希望設置的鎖因為其他鎖而被阻止設置時,該命令會等待相沖突的鎖被釋放。
(8)F_GETLK
第3個參數lock指向一個希望設置的鎖的屬性結構,如果鎖能被設置,該命令并不真的設置鎖,而是只修改lock的l_type為F_UNLCK,然后返回該結構體。如果存在一個或多個鎖與希望設置的鎖相互沖突,則fcntl返回其中的一個鎖的flock結構。
?
非阻塞I/O使我們的操作要么成功,要么立即返回錯誤,不被阻塞
實例
if ((rsck = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) == -1) { #ifdef DEBUGprintf("Failed to initialize raw socket\n"); #endifexit(0); }// 設置非堵塞,作要么成功,要么立即返回錯誤,不被阻塞 fcntl(rsck, F_SETFL, O_NONBLOCK | fcntl(rsck, F_GETFL, 0));?
總結
以上是生活随笔為你收集整理的C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AppScan---web安全检测及分析
- 下一篇: 初识联邦学习(Federated lea