婷婷综合国产,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
    韩国理伦片一区二区三区在线播放| 伊人夜夜躁av伊人久久| 欧美性生活久久| 色婷婷av一区二区三区软件| 成人国产亚洲欧美成人综合网 | 91福利在线导航| 91看片淫黄大片一级在线观看| 高清国产午夜精品久久久久久| 国产一区二区看久久| 国产福利一区二区| 91色porny| 欧美日韩免费观看一区二区三区| 欧美情侣在线播放| 欧美成人午夜电影| 久久久久99精品国产片| 最新国产成人在线观看| 亚洲精品久久嫩草网站秘色| 亚洲一线二线三线视频| 日本网站在线观看一区二区三区 | √…a在线天堂一区| 亚洲欧美二区三区| 五月天国产精品| 国产一区视频在线看| av电影一区二区| 欧美精品日日鲁夜夜添| 国产人伦精品一区二区| 亚洲一区在线观看免费观看电影高清| 日韩制服丝袜av| 不卡的av中国片| 91麻豆精品国产自产在线| 国产欧美一区二区精品性色| 一区二区三区在线免费播放| 蜜桃av一区二区| 色综合视频在线观看| 精品三级av在线| 一区二区三区欧美亚洲| 国产精品一区在线| 欧美日韩极品在线观看一区| 国产色产综合色产在线视频| 天天综合网 天天综合色| 高清不卡一区二区在线| 欧美一区二视频| 亚洲免费观看高清完整版在线观看| 久久99最新地址| 欧美午夜电影网| 综合中文字幕亚洲| 国产mv日韩mv欧美| 日韩欧美一区二区免费| 亚洲国产日韩a在线播放性色| 懂色av中文一区二区三区| 51精品视频一区二区三区| 亚洲视频在线观看一区| 国产在线麻豆精品观看| 91精品国产品国语在线不卡| 尤物在线观看一区| 成人午夜免费av| 久久精品视频一区二区| 日本亚洲天堂网| 欧美一区二区三区在线观看| 亚洲图片欧美色图| 色就色 综合激情| 亚洲视频一二区| 91丝袜美腿高跟国产极品老师 | 亚洲欧美一区二区视频| 国产精品一二三四五| 日韩一区二区三区视频| 亚洲va欧美va人人爽午夜| 91丨porny丨蝌蚪视频| 亚洲国产精品v| 风间由美一区二区三区在线观看 | 欧美在线一区二区三区| 亚洲啪啪综合av一区二区三区| 成人av影院在线| 中文字幕一区不卡| 色香蕉成人二区免费| 亚洲精品videosex极品| 欧美三级日韩在线| 日韩二区三区四区| 日韩欧美国产1| 国产一区二区三区在线看麻豆| 精品国产91乱码一区二区三区| 国产一区二区视频在线播放| 久久精品夜色噜噜亚洲aⅴ| 国产不卡在线播放| 国产精品久久久久久久久久久免费看| 成人中文字幕在线| 中文字幕在线免费不卡| 色婷婷精品久久二区二区蜜臂av| 亚洲综合免费观看高清完整版在线| 欧美日韩一区高清| 日本在线不卡一区| 久久久精品国产免费观看同学| a美女胸又www黄视频久久| 亚洲伦理在线免费看| 欧美一区二区三区四区视频| 国产在线视频精品一区| 国产精品久久久久久福利一牛影视| 91免费精品国自产拍在线不卡| 亚洲成人动漫在线免费观看| 日韩欧美精品三级| 成人久久18免费网站麻豆| 亚洲bt欧美bt精品| 精品福利视频一区二区三区| 99re这里只有精品视频首页| 日本成人在线一区| 国产精品久久久久精k8| 4438x成人网最大色成网站| 国产酒店精品激情| 亚洲国产日韩一级| 亚洲国产成人自拍| 日韩一级免费一区| 在线观看视频一区二区欧美日韩| 久久精品久久综合| 亚洲综合精品久久| 国产欧美视频一区二区| 欧美一区二区视频网站| 色噜噜狠狠色综合中国| 精品在线一区二区三区| 亚洲精品久久久蜜桃| 国产欧美日韩卡一| 日韩一级免费一区| 欧美日韩一级黄| 99re热这里只有精品免费视频| 美国一区二区三区在线播放| 亚洲精品日产精品乱码不卡| 久久久久久电影| 亚洲精品一区二区三区福利| 欧美男生操女生| 欧美怡红院视频| 色综合天天综合狠狠| 国产成人在线观看| 国产在线日韩欧美| 麻豆成人91精品二区三区| 香蕉久久一区二区不卡无毒影院| 亚洲人成亚洲人成在线观看图片| 国产精品狼人久久影院观看方式| 久久综合久色欧美综合狠狠| 日韩欧美电影一区| 日韩欧美自拍偷拍| 欧美大尺度电影在线| 宅男在线国产精品| 91麻豆精品国产自产在线观看一区 | 91久久奴性调教| 91亚洲精华国产精华精华液| 99re视频精品| 欧美在线观看你懂的| 在线视频一区二区免费| 色菇凉天天综合网| 欧美吻胸吃奶大尺度电影| 欧美在线短视频| 91精品国产欧美一区二区成人 | 午夜精品一区二区三区电影天堂 | 精品少妇一区二区三区免费观看 | 国产激情偷乱视频一区二区三区| 韩国av一区二区三区在线观看| 国产自产视频一区二区三区| 国产精品888| a级精品国产片在线观看| 色综合久久久网| 精品视频免费看| 精品久久人人做人人爽| 国产区在线观看成人精品 | 欧美日韩亚洲综合| 欧美一区二区在线看| 久久精品视频在线看| 亚洲欧美在线aaa| 天天色天天操综合| 狠狠色伊人亚洲综合成人| 国产成人99久久亚洲综合精品| 91一区二区三区在线观看| 欧洲国内综合视频| 欧美成人一区二区三区| 国产精品区一区二区三| 亚洲一区二区四区蜜桃| 国内精品免费在线观看| 91丨porny丨户外露出| 51午夜精品国产| 中文字幕欧美激情一区| 亚洲国产乱码最新视频| 免费一区二区视频| 色综合久久精品| 久久女同精品一区二区| 亚洲精选视频免费看| 久久成人久久鬼色| 一本色道a无线码一区v| 精品久久久久久久一区二区蜜臀| 国产精品乱人伦一区二区| 日韩成人一级大片| 91一区二区在线| 久久久久免费观看| 香港成人在线视频| 不卡的av在线播放| 精品99一区二区| 天天综合网 天天综合色| 成人手机在线视频| 精品国产精品网麻豆系列| 依依成人精品视频| av电影天堂一区二区在线| 久久久久亚洲蜜桃| 麻豆高清免费国产一区|