欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > fcntl函數的說明與實例 (文件加鎖)

fcntl函數的說明與實例 (文件加鎖)

熱門標簽:新鄭電銷外呼系統線路 樺甸電銷機器人 地球地圖標注方法 怎樣給景區加百度地圖標注 河北語音電銷機器人 電話機器人哪里有賣的 河南智能電話機器人公司 壽光百度地圖標注中心網站 商戶地圖標注

對文件加鎖是原子性的,可以用于進程間文件操作的同步。在linux下,有三個函數可以對文件進程加鎖,分別是fcntl、flock、lockf。這里只說fcntl,它的用法也是最復雜的。

fcntl是file control的縮寫。在linux下大部分設備都是文件,所以fcntl的功能也比較多,包括:

•Duplicating a file descriptor(復制文件描述符)
•File descriptor flags(操作close-on-exec標志)
•File status flags(操作文件O_RDONLY , O_WRONLY , O_RDWR , O_APPEND , O_NONBLOCK , O_SYNC和O_ASYNC標識)
•Advisory locking(建議性鎖)
•Mandatory locking(強制性鎖)
•Managing signals(管理信號)
•Leases(租借鎖)
•File and directory change notification (dnotify)(文件和目錄更改消息)
•Changing the capacity of a pipe(改變管道大小)

這里只說一下Advisory locking和Mandatory locking。建議性鎖是指給文件上鎖后,只在文件上設置了一個鎖的標識。其他進程在對這個文件進程操作時,可以檢測到鎖的存在,但這個鎖并不能阻止它對這個文件進行操作。這就好比紅綠燈,當亮紅燈時,告訴你不要過馬路,但如果你一定要過,也攔不住你。強制性鎖則是當給文件上鎖后,當其他進程要對這個文件進程不兼容的操作(如上了讀鎖,另一個進程要寫),則系統內核將阻塞后來的進程直到第一個進程將鎖解開。在該功能下,fcntl的函數原型為:


復制代碼
代碼如下:

#include unistd.h>
#include fcntl.h>/p> p>int fcntl(int fd, int cmd,struct flock *plock );/p> p>struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(F_GETLK only) */
...
};

Advisory locking共有三個操作,分別是F_GETLK、F_SETLK、F_SETLKW。其中F_GETLK用來測試鎖,注意是測試而不是獲取鎖;F_SETLK用來加鎖、解鎖;F_SETLKW功能同F_SETLK,只是操作變成阻塞式的。而fcntl可以用過l_whence、l_start、l_len來控制文件上鎖的區間。下面分別是上鎖、測試鎖的代碼。


復制代碼
代碼如下:

/* slock.c *//p> p>#include unistd.h>
#include fcntl.h>
#include sys/types.h>
#include sys/stat.h>/p> p>int main()
{
struct flock _lock;/p> p> _lock.l_type = F_WRLCK;
_lock.l_whence = SEEK_SET;
_lock.l_start = 0;
_lock.l_len = 0;/p> p> int fd = open( "/dev/shm/test",O_CREAT|O_RDWR,S_IRWXU|S_IRGRP|S_IWGRP|S_IRWXO );
if ( fd 0 )
{
puts( "open error" );
return 0;
}/p> p> int ret = fcntl( fd,F_SETLK,_lock );
if ( ret 0 )
{
puts( "fcntl error" );
close( fd );
return 0;
}/p> p> puts( "sleep now ..." );
sleep( 100 );
puts( "exit..." );

_lock.l_type = F_UNLCK;
_lock.l_whence = SEEK_SET;
_lock.l_start = 0;
_lock.l_len = 0;/p> p> ret = fcntl( fd,F_SETLK,_lock );
if ( ret 0 )
{
puts( "unlock error" );
}/p> p> close( fd );
}


復制代碼
代碼如下:

/* glock.c *//p> p>#include unistd.h>
#include fcntl.h>
#include sys/types.h>
#include sys/stat.h>
#include stdio.h>/p> p>int main()
{
struct flock _lock;/p> p> _lock.l_type = F_RDLCK;
_lock.l_whence = SEEK_SET;
_lock.l_start = 0;
_lock.l_len = 0;/p> p> int fd = open( "/dev/shm/test",O_RDWR );
if ( fd 0 )
{
perror( "open error" );
return 0;
}/p> p> int ret = fcntl( fd,F_GETLK,_lock );
if ( ret 0 )
{
perror( "fcntl error:" );
close( fd );
return 0;
}/p> p> printf( "lock is %d\n",_lock.l_type );/p> p> close( fd );
}

在上面的代碼中,"_lock.l_type =  F_RDLCK;"表示給文件上讀共享鎖,"_lock.l_whence = SEEK_SET;"表示從文件開頭開始加鎖,"_lock.l_start = 0;"表示偏移l_whence多少字節開始加鎖,"_lock.l_len = 0;"表示加鎖的字節數,即長度(Specifying 0  for  l_len  has  the  special meaning:  lock all bytes starting at the location specified by l_whence and l_start through to the end of file, no matter how  large  the  file grows.)。

在上面的代碼中,分別編譯為slock、glock。先運行slock再運行glock:


復制代碼
代碼如下:

./slock
sleep now ...
./glock
lock is 1
exit...

slock先給文件上寫鎖,然后glock測試讀共享鎖是否能加上,測試結果是已存在一個寫鎖(F_WRLCK,debian下定義為1)。這里需要注意的是F_GETLK是測試鎖是否能加上,如果可以,則struct flock中的l_type為F_UNLCK;如果不行,則l_type為文件當前鎖的類型,而l_pid為上鎖的進程pid。故如果slock上的鎖是F_RDLCK,glock測試的鎖也是F_RDLCK,這兩個鎖是兼容的,返回的l_type類型為F_UNLCK。即你不能通過F_GETLK來判斷文件是否上鎖,只能測試某個鎖是否能加上。

  上面的是建議性鎖,如果要實現強制性鎖,則:


復制代碼
代碼如下:

To make use of mandatory locks, mandatory locking must be enabled both on the filesystem that contains the file to be locked, and on the file itself. Mandatory locking is enabled on a filesystem using the "-o
    mand" option to mount(8), or the MS_MANDLOCK flag for mount(2). Mandatory locking is enabled on a file by disabling group execute permission
on the file and enabling the set-group-ID permission bit (see chmod(1) and chmod(2)).

這是說,要實現強制性鎖則須將文件所在的文件系統用"-o mand"參數來掛載,并且使用chmod函數將文件用戶組的x權限去掉。然后用上面同樣的代碼就可以了。我第一次見這么奇特的函數,實現一個功能并不是通過本身的參數控制,而是系統設置.....幸好我也不用強制性鎖。

  以上是fcntl加文件鎖的簡單例子。需要注意的是不同系統的實現并不一樣,宏定義也不一樣。如:

http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/sys/fcntl.h

 /* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */
#define    F_RDLCK        1        /* shared or read lock */
#define    F_UNLCK        2        /* unlock */
#define    F_WRLCK        3        /* exclusive or write lock */

 

而在debian中,/usr/include/bits/fcntl.h
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf().  */
#define F_RDLCK         0       /* Read lock.  */
#define F_WRLCK         1       /* Write lock.  */
#define F_UNLCK         2       /* Remove lock.  */

標簽:來賓 阜陽 迪慶 淄博 楚雄 遼陽 荊州 忻州

巨人網絡通訊聲明:本文標題《fcntl函數的說明與實例 (文件加鎖)》,本文關鍵詞  fcntl,函數,的,說明,與,實例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《fcntl函數的說明與實例 (文件加鎖)》相關的同類信息!
  • 本頁收集關于fcntl函數的說明與實例 (文件加鎖)的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    色婷婷久久久久swag精品| 亚洲精品日韩专区silk| 美女被吸乳得到大胸91| 欧美日韩一区二区三区四区五区六区| 91福利国产成人精品照片| 国产精品久久久久久一区二区三区| 国模少妇一区二区三区| 国产熟女一区二区| 久久久久一区二区三区四区| 极品少妇一区二区| 色屁屁草草影院ccyy.com| wwwwxxxxx欧美| 国内精品伊人久久久久av一坑| 一本加勒比北条麻妃| 日韩精品资源二区在线| 蜜臀精品久久久久久蜜臀| 免费黄色在线视频| 亚洲精品一区在线观看| 激情五月婷婷综合网| 一本在线免费视频| 国产精品久久久久久久久快鸭| 成人黄色在线看| 欧洲亚洲国产日韩| 香蕉久久夜色精品国产使用方法| 午夜男人的天堂| 欧美成人乱码一区二区三区| 精品一区二区免费在线观看| 亚洲不卡的av| 综合久久久久久久| 9191在线视频| 日韩精品一区二区三区老鸭窝| 卡一卡二国产精品| 日韩在线一卡二卡| 亚洲精品一卡二卡| 日本一卡二卡在线| 久久―日本道色综合久久| 粉嫩一区二区三区性色av| 91传媒视频在线播放| 视频在线观看一区| 久久日免费视频| 亚洲视频中文字幕| 亚洲精品乱码久久| 久久久久综合网| 91亚洲精品久久久蜜桃网站 | 午夜视频在线观看国产| 精品日韩欧美在线| 丰满白嫩尤物一区二区| 欧美日韩一级视频| 激情图片小说一区| 色天天综合色天天久久| 日韩在线a电影| 好吊日在线视频| 亚洲高清不卡在线观看| 蜜桃av乱码一区二区三区| 1024成人网| 国产福利短视频| 中文字幕制服丝袜一区二区三区| 日本久久久久久久久久| 国产亚洲一区二区三区四区| 91蝌蚪porny九色| 欧美va日韩va| 99国产精品久久久久久久久久久 | 欧美日韩欧美一区二区| 极品少妇一区二区| 欧美日韩精品二区第二页| 精品在线观看视频| 欧美日韩一区视频| 国产精品一二一区| 91精品在线一区二区| 丁香六月久久综合狠狠色| 91精品国产综合久久精品| 风流少妇一区二区| 欧美成人vps| 精品人妻一区二区三区免费| 久久女同精品一区二区| 国产免费无码一区二区| 国产欧美日韩在线看| 日韩无码精品一区二区| 综合久久久久久久| 亚洲高潮女人毛茸茸| 偷拍亚洲欧洲综合| 色婷婷综合久色| 国产呦精品一区二区三区网站| 欧美剧情电影在线观看完整版免费励志电影| 韩国av一区二区三区| 777奇米成人网| 99re在线精品| 欧美激情在线一区二区三区| 蜜桃精品成人影片| 亚洲亚洲人成综合网络| 中文字幕五月天| 狠狠网亚洲精品| 欧美一级精品大片| 欧美69精品久久久久久不卡 | 性欧美精品中出| 亚洲国产日日夜夜| 九九热最新地址| 国产一区欧美一区| 欧美成人一区二区| 中文字幕第3页| 亚洲综合色噜噜狠狠| 欧美特级一级片| 国产福利一区二区三区视频| 欧美成人精品高清在线播放| 日本精品一二三区| 亚洲自拍与偷拍| 在线观看视频欧美| 不卡高清视频专区| 国产精品美日韩| 蜜桃视频最新网址| 国产一区二区在线观看免费| 精品国产麻豆免费人成网站| 日韩av无码一区二区三区不卡 | 亚洲综合久久av一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 777色狠狠一区二区三区| 一级黄色大片免费看| 亚洲精品免费在线观看| 色哟哟一区二区| www.亚洲精品| 综合分类小说区另类春色亚洲小说欧美| 战狼4完整免费观看在线播放版| 精品影院一区二区久久久| 精品国产sm最大网站| 人妻大战黑人白浆狂泄| 日本欧美肥老太交大片| 91精品国产色综合久久久蜜香臀| 白嫩情侣偷拍呻吟刺激| 亚洲电影激情视频网站| 欧美精品一二三| 亚洲一级av无码毛片精品| 日韩精品福利网| 日韩精品影音先锋| 人妻精品久久久久中文| 国产一本一道久久香蕉| 国产欧美精品一区aⅴ影院| 国产美女高潮视频| av不卡免费电影| 一区二区在线观看免费| 欧美私人免费视频| 日韩少妇一区二区| 日韩一区精品字幕| 精品sm捆绑视频| 国产小视频你懂的| 成人黄页在线观看| 亚洲精品中文在线| 91精品国产欧美一区二区| v8888av| 国产在线一区二区综合免费视频| 欧美激情综合在线| 在线观看一区不卡| 成人午夜精品无码区| 久久国产精品区| 中文字幕av一区 二区| 色中色一区二区| 亚洲女则毛耸耸bbw| 免费在线看成人av| 欧美国产激情二区三区| 欧日韩精品视频| 中文字幕影片免费在线观看| 精品一区二区在线视频| 国产精品卡一卡二| 欧美日韩国产综合久久| 国产精品一二三区在线观看| 粉嫩一区二区三区性色av| 亚洲一线二线三线视频| 日韩欧美久久久| www日韩在线| www.美色吧.com| 国产一区二三区好的| 亚洲精品国产a| 日韩欧美在线影院| 欧美肥妇bbwbbw| 久草免费资源站| 国产乱子轮精品视频| 亚洲自拍偷拍麻豆| 久久婷婷久久一区二区三区| 日本福利一区二区| 国产熟妇久久777777| 成人ar影院免费观看视频| 亚洲18色成人| 中文子幕无线码一区tr| 欧美剧在线免费观看网站| 精品少妇一区二区三区密爱| 成人欧美精品一区二区| 国产高清一区日本| 亚洲高清免费视频| 国产精品视频麻豆| 欧美一级淫片007| 在线免费观看亚洲视频| 亚洲精品乱码久久久久久不卡| 风间由美一区二区av101 | 久久看人人爽人人| 欧美丝袜丝交足nylons图片| 色屁屁草草影院ccyy.com| 丰满熟女人妻一区二区三区| 高清在线成人网| 看片网站欧美日韩| 亚洲影视资源网| 国产精品伦理一区二区|