日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)

發布時間:2025/3/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

fcntl系統調用可以用來對已打開的文件描述符進行各種控制操作以改變已打開文件的的各種屬性

?

函數原型:

  • #include<unistd.h>??
  • #include<fcntl.h>??
  • int?fcntl(int?fd,?int?cmd);??
  • int?fcntl(int?fd,?int?cmd,?long?arg);??
  • int?fcntl(int?fd,?int?cmd?,struct?flock*?lock);??
  • 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的結構體

    ?

  • struct?flock??
  • {??
  • ????short_l_type;????/*鎖的類型*/??
  • ????short_l_whence;??/*偏移量的起始位置:SEEK_SET,SEEK_CUR,SEEK_END*/??
  • ????off_t_l_start;?????/*加鎖的起始偏移*/??
  • ????off_t_l_len;????/*上鎖字節*/??
  • ????pid_t_l_pid;???/*鎖的屬主進程ID?*/??
  • };???
  • 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。