婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 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函數的說明與實例 (文件加鎖)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品乱码一区二区三区软件 | 一区2区3区在线看| 91精品国产福利| 亚洲成av人片www| 国产成人精品午夜视频免费| 911精品国产一区二区在线| 欧美性色综合网| 五月婷婷综合激情| 调教+趴+乳夹+国产+精品| 成人av综合在线| 国产精品水嫩水嫩| 91亚洲资源网| 91天堂素人约啪| 亚洲一区二区三区在线播放| 亚洲成精国产精品女| 午夜欧美电影在线观看| 麻豆成人av在线| 久国产精品韩国三级视频| 欧美精选在线播放| 日韩av不卡在线观看| 精品日本一线二线三线不卡| 久久综合九色综合97婷婷| 成人小视频免费在线观看| 亚洲啪啪综合av一区二区三区| 欧美激情资源网| 亚洲女厕所小便bbb| 欧美男人的天堂一二区| 7777精品伊人久久久大香线蕉 | 国产成人丝袜美腿| 99精品在线免费| 日韩中文字幕不卡| 精品久久久久久久久久久久久久久 | 一级日本不卡的影视| 在线观看一区二区精品视频| 亚洲一区二区三区自拍| 蜜桃传媒麻豆第一区在线观看| 久久女同精品一区二区| 亚洲另类色综合网站| 精品久久一二三区| 丰满亚洲少妇av| 91成人在线精品| 国产三区在线成人av| 亚洲国产成人av网| aaa欧美色吧激情视频| 天天综合网 天天综合色| 国产成人精品三级| 青椒成人免费视频| 亚洲天天做日日做天天谢日日欢| 日韩1区2区3区| 一区二区在线电影| 国产三级精品三级在线专区| 欧美老女人第四色| 91久久免费观看| 欧美国产日韩在线观看| 亚洲精品一区二区三区四区高清| 亚洲精品国产成人久久av盗摄| 欧美高清一级片在线| 亚洲精品视频在线看| 国产91高潮流白浆在线麻豆| 日韩一区二区在线观看| 一区二区三区在线看| 国产精品一区免费视频| 日韩欧美色电影| 欧美理论片在线| 国产片一区二区三区| 久久这里只有精品6| 欧美一区二区免费| 91麻豆精品国产91久久久资源速度| 亚洲免费大片在线观看| 国产精品电影一区二区| 国产成+人+日韩+欧美+亚洲| 26uuu国产电影一区二区| 精品国产一区二区亚洲人成毛片| 555www色欧美视频| 欧美妇女性影城| 欧美人xxxx| 欧美影视一区在线| 欧美伊人久久大香线蕉综合69| av网站一区二区三区| 色婷婷亚洲精品| 色噜噜夜夜夜综合网| 亚洲午夜久久久久久久久电影网| 亚洲综合在线免费观看| 肉丝袜脚交视频一区二区| 9191成人精品久久| 欧美一区二区女人| 久久看人人爽人人| 成人黄色大片在线观看| 91色.com| 67194成人在线观看| 精品国产一二三| 一区精品在线播放| 性欧美大战久久久久久久久| 天堂久久久久va久久久久| 日韩视频在线永久播放| 国产一区二区中文字幕| 国产成人aaa| 欧美日韩亚洲综合在线| 日韩av电影天堂| 国产亚洲欧美日韩在线一区| 在线影院国内精品| 日韩三区在线观看| 国产精品久久久久久久久免费相片 | 成人av网站在线观看| 欧美最猛性xxxxx直播| 欧美一级黄色录像| 久久久久久夜精品精品免费| ●精品国产综合乱码久久久久 | 久久久午夜电影| 99riav久久精品riav| 日韩国产欧美在线播放| 国产精品一级片在线观看| 成人黄页在线观看| 在线观看日韩毛片| 国产欧美精品一区二区三区四区| 亚洲精品免费在线播放| 国产永久精品大片wwwapp| 最新中文字幕一区二区三区| 美女尤物国产一区| www.色精品| 蜜桃一区二区三区四区| 亚洲男女一区二区三区| 国产一区福利在线| 日本aⅴ亚洲精品中文乱码| 国产精品国产a| 一区二区三区欧美日韩| 国产日韩欧美麻豆| 欧美一级免费观看| 亚洲欧美色一区| 成人短视频下载| 国产亚洲成年网址在线观看| 9191精品国产综合久久久久久| 91最新地址在线播放| 成人黄动漫网站免费app| 久久精品国产色蜜蜜麻豆| 亚洲影院理伦片| 亚洲欧洲一区二区在线播放| 久久久91精品国产一区二区精品 | 丰满少妇久久久久久久| 日韩一卡二卡三卡四卡| 亚洲综合一区在线| 亚洲男人的天堂在线aⅴ视频| 欧美国产精品一区| 久久精品欧美一区二区三区不卡| 精品国产乱码久久久久久影片| 男男视频亚洲欧美| 日韩avvvv在线播放| 欧美一区二区人人喊爽| 欧美日本高清视频在线观看| 欧美日韩精品一二三区| 在线成人免费视频| 青椒成人免费视频| 久久国产精品99久久久久久老狼 | 亚洲欧美日韩国产手机在线| 中文字幕在线观看一区| 亚洲欧美偷拍卡通变态| 国产精品伦理一区二区| 1000部国产精品成人观看| 日本精品一级二级| 亚洲男人都懂的| 亚洲一区二区视频在线| 91精品国产乱| 国产精品1区二区.| 日韩一区中文字幕| 一区二区三区影院| 琪琪久久久久日韩精品| 国产尤物一区二区在线| 1000部国产精品成人观看| 欧美在线观看视频一区二区| 午夜成人在线视频| 韩国av一区二区| 97成人超碰视| 日韩有码一区二区三区| 久久这里只有精品首页| 亚洲欧洲三级电影| 亚洲成在线观看| 国产亚洲1区2区3区| 在线看不卡av| 国产一区二区0| 亚洲精品第一国产综合野| 日韩女优制服丝袜电影| 国产精品麻豆网站| 欧美一区三区二区| 成人高清视频在线| 欧美日韩国产中文| 国产三级三级三级精品8ⅰ区| 国产曰批免费观看久久久| 一道本成人在线| 亚洲精品一区二区三区四区高清| 国产精品系列在线播放| 亚洲啪啪综合av一区二区三区| 日韩欧美一级二级| 一区二区在线观看视频在线观看| 国产一区二区三区免费| 在线亚洲一区二区| 久久久www成人免费毛片麻豆| 97久久超碰国产精品| 91精品国产欧美一区二区| 国产丝袜欧美中文另类| 欧美性xxxxxxxx|