亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

fcntl函數的使用詳解

2020-01-26 16:01:48
字體:
來源:轉載
供稿:網友
(1)fcntl函數說明
前面的這5個基本函數實現了文件的打開、讀寫等基本操作,這一節將討論的是,在文 件已經共享的情況下如何操作,也就是當多個用戶共同使用、操作一個文件的情況,這時,Linux 通常采用的方法是給文件上鎖,來避免共享的資源產生競爭的狀態。
文件鎖包括建議性鎖強制性鎖
建議性鎖要求每個上鎖文件的進程都要檢查是否有鎖存,并且尊重已有的鎖。在一般情況下,內核和系統都不使用建議性鎖。強制性鎖是由內 核執行的鎖,當一個文件被上鎖進行寫入操作的時候,內核將阻止其他任何文件對其進行讀寫操作。采用強制性鎖對性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。
在 Linux 中,實現文件上鎖的函數有lock和fcntl,其中flock用于對文件施加建議性鎖,而fcntl不僅可以施加建議性鎖,還可以施加強制鎖。同時,fcntl還能對文件的某一記錄進行上鎖,也就是記錄鎖。
記錄鎖又可分為讀取鎖寫入鎖,其中讀取鎖又稱為共享鎖,它能夠使多個進程都能在文件的同一部分建立讀取鎖。而寫入鎖又稱為排斥鎖,在任何時刻只能有一個進程在文件的某個部分上建立寫入鎖。當然,在文件的同一部分不能同時建立讀取鎖和寫入鎖。
注意:
fcntl是一個非常通用的函數,它還可以改變文件進程各方面的屬性,在本節中,主要介紹它建立記錄鎖的方法,關于它其他用戶感興趣的讀者可以參看fcntl手冊。
(2)fcntl函數格式
用于建立記錄鎖的fcntl函數格式如表6.6 所示。
表6.6 fcntl函數語法要點所需頭文件
復制代碼 代碼如下:

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>

函數原型int fcnt1(int fd, int cmd, struct flock *lock)
fd:文件描述符
F_DUPFD:復制文件描述符
F_GETFD:獲得fd的close-on-exec標志,若標志未設置,則文件經過exec函數之后仍保持打開狀態
F_SETFD:設置close-on-exec標志,該標志以參數arg的FD_CLOEXEC位決定
F_GETFL:得到open設置的標志
函數傳入值
cmd
F_SETFL:改變open設置的標志
F_GETFK:根據lock描述,決定是否上文件鎖
F_SETFK:設置lock描述的文件鎖
F_SETLKW:這是F_SETLK的阻塞版本(命令名中的W表示等待(wait))。
如果存在其他鎖,則調用進程睡眠;如果捕捉到信號則睡眠中斷
F_GETOWN:檢索將收到SIGIO和SIGURG信號的進程號或進程組號
F_SETOWN:設置進程號或進程組號
函數返回值
Lock:結構為flock,設置記錄鎖的具體狀態,后面會詳細說明
成功:0
-1:出錯
這里,lock的結構如下所示:
復制代碼 代碼如下:

Struct flock{
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
lock結構中每個變量的取值含義如表6.7 所示。
表6.7 lock結構變量取值
F_RDLCK:讀取鎖(共享鎖)
l_type F_WRLCK:寫入鎖(排斥鎖)
F_UNLCK:解鎖
l_stat 相對位移量(字節)
SEEK_SET:當前位置為文件的開頭,新位置為偏移量的大小
SEEK_CUR:當前位置為文件指針的位置,新位置為當前位置加上偏移量
l_whence:相對位移量的起點(同lseek 的whence)。
SEEK_END:當前位置為文件的結尾,新位置為文件的大小加上偏移量的大小
l_len 加鎖區域的長度
小技巧:
為加鎖整個文件,通常的方法是將l_start 說明為0,l_whence 說明為SEEK_SET,l_len 說明為0。
(3)fcntl使用實例
下面首先給出了使用fcntl 函數的文件記錄鎖函數。在該函數中,首先給flock 結構體的對應位賦予相應的值。接著使用兩次fcntl函數分別用于給相關文件上鎖和判斷文件是否可以上鎖,這里用到的cmd值分別為F_SETLK 和F_GETLK。
這個函數的源代碼如下所示:
復制代碼 代碼如下:

/*lock_set函數*/
void lock_set(int fd, int type)
{
struct flock lock;
lock.l_whence = SEEK_SET;//賦值lock結構體
lock.l_start = 0;
lock.l_len =0;
while(1){
lock.l_type = type;
/*根據不同的type值給文件上鎖或解鎖*/
if((fcntl(fd, F_SETLK, &lock)) == 0){
if( lock.l_type == F_RDLCK )
printf("read lock set by %d/n",getpid());
else if( lock.l_type == F_WRLCK )
printf("write lock set by %d/n",getpid());
else if( lock.l_type == F_UNLCK )
printf("release lock by %d/n",getpid());
return;
}
/*判斷文件是否可以上鎖*/
fcntl(fd, F_GETLK,&lock);
/*判斷文件不能上鎖的原因*/
if(lock.l_type != F_UNLCK){
/*/該文件已有寫入鎖*/
if( lock.l_type == F_RDLCK )
printf("read lock already set by %d/n",lock.l_pid);
/*該文件已有讀取鎖*/
else if( lock.l_type == F_WRLCK )
printf("write lock already set by %d/n",lock.l_pid);
getchar();
}
}
}

下面的實例是測試文件的寫入鎖,這里首先創建了一個hello文件,之后對其上寫入鎖,最后釋放寫入鎖。代碼如下所示:
復制代碼 代碼如下:

/*fcntl_write.c測試文件寫入鎖主函數部分*/
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fd;
/*首先打開文件*/
fd=open("hello",O_RDWR | O_CREAT, 0666);
if(fd < 0){
perror("open");
exit(1);
}
/*給文件上寫入鎖*/
lock_set(fd, F_WRLCK);
getchar();
/*給文件接鎖*/
lock_set(fd, F_UNLCK);
getchar();
close(fd);
exit(0);
}

為了能夠使用多個終端,更好地顯示寫入鎖的作用,本實例主要在PC 機上測試,讀者可將其交叉編譯,下載到目標板上運行。下面是在PC 機上的運行結果。為了使程序有較大的靈活性,筆者采用文件上鎖后由用戶鍵入一任意鍵使程序繼續運行。建議讀者開啟兩個終端,并且在兩個終端上同時運行該程序,以達到多個進程操作一個文件的效果。在這里,筆者首先運行終端一,請讀者注意終端二中的第一句。
終端一:
復制代碼 代碼如下:

[root@localhost file]# ./fcntl_write
write lock set by 4994
release lock by 4994

終端二:
復制代碼 代碼如下:

[root@localhost file]# ./fcntl_write
write lock already set by 4994
write lock set by 4997
release lock by 4997

由此可見,寫入鎖為互斥鎖,一個時刻只能有一個寫入鎖存在。
接下來的程序是測試文件的讀取鎖,原理同上面的程序一樣。
復制代碼 代碼如下:

/*fcntl_read.c測試文件讀取鎖主函數部分*/
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fd;
fd=open("hello",O_RDWR | O_CREAT, 0666);
if(fd < 0){
perror("open");
exit(1);
}
/*給文件上讀取鎖*/
lock_set(fd, F_RDLCK);
getchar();
/*給文件接鎖*/
lock_set(fd, F_UNLCK);
getchar();
close(fd);
exit(0);
}

同樣開啟兩個終端,并首先啟動終端一上的程序,其運行結果如下所示:
終端一:
復制代碼 代碼如下:

[root@localhost file]# ./fcntl2
read lock set by 5009
release lock by 5009

終端二:
復制代碼 代碼如下:

[root@localhost file]# ./fcntl2
read lock set by 5010
release lock by 5010

讀者可以將此結果與寫入鎖的運行結果相比較,可以看出,讀取鎖為共享鎖,當進程5009已設定讀取鎖后,進程5010 還可以設置讀取鎖。
思考:
如果在一個終端上運行設置讀取鎖,則在另一個終端上運行設置寫入鎖,會有什么結果呢?
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩精品在线| 精品国产一区二区三区久久狼黑人| 久久久精品亚洲| 日韩在线视频播放| 午夜免费久久久久| 成年无码av片在线| 欧美成人在线影院| 亚洲网站在线播放| 欧美肥婆姓交大片| 久久精品视频亚洲| 国产一区二区色| 欧美成人免费网| 岛国视频午夜一区免费在线观看| 日本精品久久电影| 社区色欧美激情 | 国产精品偷伦免费视频观看的| 久久久久久亚洲精品| 国产欧美精品在线| 欧美成人合集magnet| 久久久精品视频在线观看| 国产精品久久久久国产a级| 亚洲精品一区二三区不卡| 日韩精品在线电影| 久久视频在线免费观看| 欧美xxxwww| 亚洲欧美日本精品| 日韩av理论片| 热久久美女精品天天吊色| 日韩精品在线电影| 亚洲人成五月天| 正在播放亚洲1区| 国产精品99蜜臀久久不卡二区| 成人久久一区二区| 亚洲天堂免费观看| 亚洲激情自拍图| 国产日韩欧美电影在线观看| 国产高清视频一区三区| 萌白酱国产一区二区| 中文字幕亚洲第一| 国产精品嫩草视频| 亚洲跨种族黑人xxx| 高清视频欧美一级| 国产精品久久久久久久久久久久久久| 在线日韩精品视频| 亚洲国产美女精品久久久久∴| 中文字幕亚洲国产| 亚洲高清一二三区| 亚洲欧美一区二区三区情侣bbw| 久久久成人的性感天堂| 亚洲欧美激情一区| 日韩欧美成人免费视频| 亚洲美女在线观看| 日韩暖暖在线视频| 一区二区三区美女xx视频| 欧日韩不卡在线视频| 欧美日韩国产123| 国产一区二区免费| 欧美日韩在线视频一区| 精品国产乱码久久久久酒店| 国产精品国产三级国产aⅴ9色| www.日本久久久久com.| www欧美xxxx| 亚洲国产成人91精品| 久久精品成人动漫| 中文字幕少妇一区二区三区| 在线观看精品自拍私拍| 欧美电影免费观看网站| 欧美美最猛性xxxxxx| 国产午夜精品视频| 日韩中文字幕在线| 久久91亚洲精品中文字幕| 国产欧美精品日韩| 欧美电影在线观看网站| 久久伊人精品一区二区三区| 日韩在线资源网| 久久免费国产视频| 91香蕉亚洲精品| 亚洲片av在线| 国色天香2019中文字幕在线观看| 国产精品福利在线| 亚洲精品美女在线观看| 中文字幕v亚洲ⅴv天堂| 韩国三级日本三级少妇99| 亚洲片在线资源| 欧美电影在线观看完整版| 国产精品揄拍一区二区| 日本三级韩国三级久久| 国产99在线|中文| 亚洲成人激情视频| 国内精品中文字幕| 国产精品成人一区二区| 夜夜嗨av一区二区三区免费区| 欧美日韩在线观看视频小说| 蜜臀久久99精品久久久无需会员| 国产日韩欧美日韩大片| 亚洲精品久久久久中文字幕欢迎你| 欧美性猛交xxxx免费看漫画| 久久视频国产精品免费视频在线| 国产一区二区黑人欧美xxxx| 精品国产福利在线| 91天堂在线观看| 久久久久久久久久国产| 亚洲字幕一区二区| 亚洲色图25p| 国内偷自视频区视频综合| 久久精品人人做人人爽| 成人春色激情网| 国产精品久久999| 欧美亚洲一区在线| 97国产一区二区精品久久呦| 性日韩欧美在线视频| 国产亚洲精品综合一区91| 国内精品久久影院| 国产精品观看在线亚洲人成网| 国内外成人免费激情在线视频网站| 日韩国产欧美精品在线| 国产精品电影观看| 亚洲综合最新在线| 91欧美日韩一区| 日韩欧美一区二区在线| 91精品美女在线| 亚洲国产日韩欧美在线图片| 久久久久久18| 久久在精品线影院精品国产| 亚洲xxx大片| 欧美日韩亚洲一区二区三区| 欧美xxxx做受欧美.88| 国产精品成人免费视频| 国产一区二区三区在线观看视频| 久久久久中文字幕| 国产专区精品视频| 国产精品爽爽爽爽爽爽在线观看| 色综久久综合桃花网| 91精品在线观看视频| 久久久久999| 久久99国产精品自在自在app| 国产精品美女久久久免费| 国产精品99蜜臀久久不卡二区| 欧美成人中文字幕在线| 国产精品精品视频一区二区三区| 国产精品爽爽爽爽爽爽在线观看| 日韩有码在线视频| 国产成人在线亚洲欧美| 欧美乱大交xxxxx| 国产精品青青在线观看爽香蕉| 国产成+人+综合+亚洲欧美丁香花| 中文字幕亚洲在线| 亚洲国产成人久久综合一区| 欧美性少妇18aaaa视频| 欧美激情在线观看| 91精品国产91久久久久久吃药| 亚洲影院在线看| 国产精品在线看| 97超级碰在线看视频免费在线看| 91精品在线影院| 久久91精品国产91久久跳| 日韩欧美在线网址| 国产成人精品在线播放| 欧美性xxxxx极品| 国产精品久久久久久久午夜| 中文字幕在线精品| 岛国av一区二区三区| 国产精品xxx视频| 亚洲精品在线不卡|