校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 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函數的說明與實例 (文件加鎖)的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    精品三级在线看| 久久国产综合精品| www.亚洲在线| 中文字幕久久午夜不卡| 国产精品一区二区黑丝| 久久久久久亚洲综合影院红桃| 久久精品久久综合| 国产欧美一区二区精品忘忧草| 国产一区二区美女| 国产欧美精品国产国产专区| 成人app软件下载大全免费| 亚洲色图欧洲色图| 欧洲一区二区av| 奇米色一区二区三区四区| 欧美草草影院在线视频| 国产制服丝袜一区| 中文字幕一区二区日韩精品绯色| 一本一道综合狠狠老| 亚洲成人av一区| 日韩欧美高清一区| 顶级嫩模精品视频在线看| 亚洲免费av高清| 欧美一二三区在线| 国产成人av电影免费在线观看| 国产精品乱子久久久久| 欧美视频在线一区二区三区 | 美女视频一区在线观看| 精品处破学生在线二十三| 97久久久精品综合88久久| 亚洲综合免费观看高清在线观看| 制服丝袜在线91| 国产精品中文有码| 亚洲大片免费看| 国产亚洲综合色| 欧美日韩在线播放| 国产成人在线观看免费网站| 亚洲最快最全在线视频| 日韩欧美国产成人一区二区| 91美女精品福利| 免费成人性网站| 亚洲欧洲av一区二区三区久久| 欧美欧美欧美欧美| 成人av电影在线网| 日本在线播放一区二区三区| 国产精品福利影院| 日韩一区二区不卡| 在线中文字幕一区二区| 国产成人高清在线| 蜜臀久久99精品久久久画质超高清 | 欧美日韩国产高清一区| 成人av在线电影| 久久精品久久精品| 亚洲电影一级片| 综合久久国产九一剧情麻豆| 亚洲精品在线电影| 欧美精品日韩精品| 91在线视频免费观看| 国产成人自拍在线| 韩国精品主播一区二区在线观看| 亚洲国产另类精品专区| 亚洲欧洲国产专区| 欧美国产精品一区| 国产性色一区二区| 日韩欧美中文字幕制服| 精品视频999| 91视频在线观看免费| 国产成人av电影在线观看| 久久丁香综合五月国产三级网站| 亚洲国产成人av| 亚洲国产aⅴ天堂久久| 亚洲精品国产精华液| 中文字幕中文字幕中文字幕亚洲无线| 精品国产一区二区三区四区四 | 国产精品第一页第二页第三页| 精品国产亚洲在线| 日韩欧美一级二级三级久久久| 欧美日韩中文字幕一区| 在线欧美日韩精品| 色哟哟在线观看一区二区三区| 99re这里只有精品视频首页| 成人av动漫网站| 成人爱爱电影网址| 99久久免费视频.com| av动漫一区二区| 99精品热视频| 色婷婷精品久久二区二区蜜臂av| 不卡的电影网站| 成人黄色电影在线 | 欧美一级高清片在线观看| 欧美久久久久久久久中文字幕| 欧美日韩中文字幕一区| 欧美日韩的一区二区| 欧美精品乱人伦久久久久久| 7777精品久久久大香线蕉 | 久久先锋影音av鲁色资源| 久久一区二区视频| 亚洲国产精品99久久久久久久久| 中文在线一区二区| 亚洲精品成人少妇| 亚洲成人一二三| 蜜臀久久99精品久久久久宅男 | 久久嫩草精品久久久久| 国产欧美精品一区| 亚洲激情在线激情| 午夜电影网一区| 蜜桃视频免费观看一区| 国产乱码精品一区二区三区av | 精品一区二区综合| 成人免费av资源| 欧亚一区二区三区| 欧美精品一区二区三区久久久| 国产丝袜美腿一区二区三区| 亚洲欧美另类小说| 蜜臀久久99精品久久久画质超高清 | 国产激情精品久久久第一区二区| 不卡的电视剧免费网站有什么| 欧美亚洲国产怡红院影院| 欧美一级片在线| 中文字幕第一区综合| 亚洲成年人影院| 国产激情精品久久久第一区二区| 色婷婷综合视频在线观看| 91精品国产综合久久久久久久| 久久久久久久久免费| 亚洲国产成人tv| 大尺度一区二区| 欧美日韩一级片在线观看| 久久综合色综合88| 亚洲自拍偷拍综合| 国产乱国产乱300精品| 欧美日韩中字一区| 国产精品久久久久久户外露出| 日韩精品一区第一页| 国产成人8x视频一区二区| 欧美色成人综合| 国产女人水真多18毛片18精品视频| 亚洲国产日日夜夜| aa级大片欧美| 精品美女被调教视频大全网站| 亚洲日本va午夜在线影院| 精品一区二区三区的国产在线播放 | 欧美专区亚洲专区| 国产欧美精品国产国产专区| 秋霞电影网一区二区| 色综合天天综合狠狠| 精品国产免费人成电影在线观看四季| 伊人开心综合网| 不卡视频在线看| 国产无人区一区二区三区| 日韩激情一二三区| 欧美视频一区二区在线观看| 国产精品久久久久久久蜜臀| 老司机免费视频一区二区| 欧美日韩三级视频| 亚洲欧美另类小说| 成人精品视频网站| 久久精子c满五个校花| 免费看欧美美女黄的网站| 91搞黄在线观看| 日韩一区中文字幕| 成人白浆超碰人人人人| 国产精品网曝门| 国产福利91精品| 久久久久久久精| 国产一区美女在线| www激情久久| 国产美女视频91| 国产欧美一区二区在线观看| 国产一区二三区| 久久这里只精品最新地址| 狠狠色综合色综合网络| 精品久久久久久久久久久久包黑料| 日韩成人一级大片| 欧美一区国产二区| 日本三级亚洲精品| 日韩欧美亚洲国产精品字幕久久久| 丝袜美腿亚洲色图| 欧美videos中文字幕| 国产永久精品大片wwwapp| 26uuuu精品一区二区| 国产成人精品三级| 国产精品污网站| 色八戒一区二区三区| 亚洲国产成人va在线观看天堂| 欧美日韩美女一区二区| 日日夜夜精品视频天天综合网| 在线不卡中文字幕播放| 日本美女一区二区三区视频| 精品国产伦一区二区三区免费| 粉嫩嫩av羞羞动漫久久久| 亚洲精品中文在线影院| 欧美三级韩国三级日本一级| 免费观看在线色综合| 国产欧美日韩不卡| 在线观看日韩国产| 精品一区二区三区影院在线午夜| 国产婷婷一区二区| 在线观看免费成人| 国内外精品视频| 18欧美亚洲精品|