青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

桃源谷

心靈的旅行

人生就是一場旅行,不在乎旅行的目的地,在乎的是沿途的風景和看風景的心情 !
posts - 32, comments - 42, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

給文件鎖設定timeout

Posted on 2007-11-26 14:52 lymons 閱讀(2498) 評論(0)  編輯 收藏 引用 所屬分類: CUnix/Linux
From 2008精選
Linux 文件鎖是建議鎖,也有人把它叫做記錄鎖,是通過系統(tǒng)調(diào)用fcntl(2)來實現(xiàn)的。
這種鎖在鎖定文件時有兩種模式,分別是阻塞(block)和非阻塞模式。
在編碼時比較常用的是有一種的非阻塞模式,也就是發(fā)現(xiàn)文件已經(jīng)被其他進程
鎖定時,立即返回不予等待。而阻塞模式則正好與它相反,也就是一直等待直到
其他進程釋放文件鎖為止。
注:關于詳細內(nèi)容請參看《Unix環(huán)境高級編程》

不過,有的時候也會用到阻塞模式的文件鎖,而且會要求不能被一直阻塞,等待
了一定時間后應返回。也就是說,想給阻塞版本的文件鎖加上一個超時時間(timeout)。

通過man手冊,fcntl(2)里面沒有關于在阻塞模式時,設置超時時間的任何描述。
但從man手冊里我們發(fā)現(xiàn),文件鎖在阻塞時會被信號(signal)中斷。所以我們就像
可以利用設置信號軟中斷來實現(xiàn)一個自己版本的等待超時呢。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <fcntl.h>
 5 #include <sys/types.h>
 6 #include <sys/stat.h>
 7 #include <signal.h>
 8 
 9 #define readw_lock(fd) \
10     lock_reg((fd), F_SETLKW, F_RDLCK)
11 #define writew_lock(fd) \
12     lock_reg((fd), F_SETLKW, F_WRLCK)
13 #define unlock(fd) \
14     lock_reg((fd), F_SETLK, F_UNLCK)
15 
16 typedef int (*LW_FN)(char *fname);
17 
18 int
19 lock_reg(int fd, int cmd, int type)
20 {
21     struct flock lock;
22     lock.l_type = type;
23     lock.l_start = 0;
24     lock.l_whence = SEEK_SET;
25     lock.l_len = 0;
26 
27     return fcntl(fd, cmd, &lock);
28 }
29 
30 void hander(int signo)
31 {
32     // do nothing
33     return;
34 }
35 
36 int lockw(char *fname, LW_FN fn, int timeout)
37 {
38     int ret = 0;
39     int fd;
40     struct sigaction act, oact;
41 
42     if ((fd = open(fname,  O_CREAT | O_RDWR, 0666)) == -1) {
43         printf("open failed!\n");
44         return -1;
45     }
46 
47     // set timer to wakeup fcntl
48     act.sa_handler = hander;
49     sigemptyset(&act.sa_mask);
50     act.sa_flags = 0// here, must be zero for wakeup fcntl
51     sigaction(SIGALRM, &act, &oact);
52 
53     int sec = alarm(timeout);
54 
55     if (writew_lock(fd) == 0) {
56         alarm(sec);
57         // recovery signal handler.
58         sigaction(SIGALRM, &oact, NULL);
59        
60        
printf("locked OK!\n");
61        
62
         // here, add code about file.
63 #ifdef _TEST
64         getchar();
65         ret = 0;
66 #else
67         ret = fn(fname);
68 #endif
69 
70         printf("unlocked!\n");
71         unlock(fd);
72     }
73     else {
74         alarm(sec);
75         // recovery signal handler.
76         sigaction(SIGALRM, &oact, NULL);
77         // lock failed, because of timeout.
78         printf("write lock failed\n");
79         ret = -1;
80     }
81 
82     return ret;
83 }
84 
85 // test code
86 int func(char *fname)
87 {
88     printf("check file:%s \n", fname);
89     getchar();
90     return 0;
91 }
92 
93 int main()
94 {
95     return lockw("file.lock", func, 5);
96 }
97 
98 


該程序的原理是,利用了alarm(2)設置的定時器,在一定時間過后會產(chǎn)生SIGALRM信號,會使當前正在
執(zhí)行的系統(tǒng)調(diào)用中斷,導致該系統(tǒng)調(diào)用(fcntl)返回失敗。

上述代碼有以下的說明:
 1. 信號處理函數(shù)hander是一個空函數(shù),里面什么也不做。它的存在就是為了接收SIGALRM信號
 2. sigactionsa_flags成員一定要設置成0,否則不會是系統(tǒng)調(diào)用中斷
 3. 為了防止把以前設置的定時器破壞,不管是加鎖成功還是失敗都立即恢復以前的定時器。
 4. 因為為了接收SIGALRM信號,我們設置了它的信號處理函數(shù)。那在加鎖失敗和成功后也要恢復以前的設定。

注:雖然上面的代碼能實現(xiàn)文件鎖超時等待的問題,但又引入了另一個問題,就是該代碼會破壞以前設定的定時器,即使是后面也恢復了以前的定時器設置,也會有一些副作用。比如:當為了等待其他進程釋放文件鎖,傳遞到lockw函數(shù)里的等待時間(也就是形參timeout)超過了以前設定的定時器觸發(fā)時間,那這段期間內(nèi)的以前設定的定時器就無效了。也就是說, 在調(diào)用lockw之前,該進程了已經(jīng)設定了一個2秒的定時器, 而這個進程在調(diào)用lockw時傳遞的timeout時間為10秒(鎖定的阻塞時間為10秒), 那么從調(diào)用lockw的那一刻起,2秒的定時器就無效了,知道鎖定成功或者失敗為止.

我的個人簡歷第一頁 我的個人簡歷第二頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美日韩一区二区三区| 久久久久国内| 国产精品久久久久久久久久久久久久 | 午夜国产一区| 午夜精品久久久久久久99樱桃 | 亚洲一级电影| 欧美一区2区视频在线观看| 性欧美xxxx视频在线观看| 久久av二区| 欧美1区3d| 国产精品久久综合| 亚洲麻豆国产自偷在线| 亚洲欧美一区二区三区久久| 久久久噜噜噜| 亚洲伊人伊色伊影伊综合网| 老司机精品视频一区二区三区| 欧美精品一区二区三区视频| 国产日本欧洲亚洲| 中文一区二区| 亚洲精品一区二区三区av| 久久免费视频这里只有精品| 国产精品永久免费| 亚洲视频在线视频| 亚洲精品欧美一区二区三区| 久久精品午夜| 国产一区二区按摩在线观看| 在线亚洲欧美| 夜夜嗨av一区二区三区网站四季av | 亚洲性夜色噜噜噜7777| 亚洲第一区色| 久久精品中文| 亚洲在线一区二区三区| 欧美日韩综合久久| 午夜国产精品影院在线观看| 亚洲欧洲精品一区二区三区| 欧美a级在线| 中国亚洲黄色| 欧美一区二区视频观看视频| 国产日韩欧美综合一区| 麻豆国产精品777777在线| 久久久高清一区二区三区| 伊人色综合久久天天五月婷| 欧美不卡激情三级在线观看| 久久久精品999| 日韩一级在线观看| 亚洲影院高清在线| 在线不卡中文字幕| 日韩系列在线| 激情婷婷亚洲| 亚洲视频免费看| 亚洲美女诱惑| 久久精品国语| 性欧美8khd高清极品| 欧美二区在线| 裸体丰满少妇做受久久99精品| 欧美激情精品久久久久久大尺度| 香蕉久久一区二区不卡无毒影院| 久久综合中文| 嫩草成人www欧美| 国产亚洲综合在线| 亚洲网站在线| 亚洲一区二区三区在线看| 久久色在线播放| 久久久久青草大香线综合精品| 欧美日韩大片| 亚洲美女在线视频| 亚洲日本免费| 蜜桃av噜噜一区| 国内偷自视频区视频综合| 亚洲主播在线| 欧美在线一级va免费观看| 欧美涩涩网站| 欧美亚洲日本一区| 久久精品女人| 亚洲欧洲日本国产| 欧美片网站免费| 香蕉尹人综合在线观看| 久久国产天堂福利天堂| 亚洲黄色成人久久久| 欧美—级高清免费播放| 99伊人成综合| 久久综合狠狠综合久久综合88| 在线观看日韩www视频免费| 美女视频黄 久久| 亚洲毛片在线观看.| 久久久久久久久蜜桃| 亚洲人成欧美中文字幕| 国产精品区二区三区日本| 六月婷婷一区| 久久精品亚洲乱码伦伦中文 | 国内不卡一区二区三区| 欧美高清一区| 久久亚洲欧美| 性久久久久久| 亚洲校园激情| 中文成人激情娱乐网| 欧美激情第3页| 男人天堂欧美日韩| 久久精品91久久久久久再现| 亚洲欧美日韩精品久久久久 | 欧美裸体一区二区三区| 久久久久久日产精品| 亚洲一区黄色| 中文精品视频| av成人国产| 亚洲国产天堂久久国产91| 国内自拍亚洲| 伊伊综合在线| 亚洲国产老妈| 亚洲精选在线观看| 亚洲久色影视| 亚洲一区二区三区乱码aⅴ| 一区二区三区国产| 亚洲一区一卡| 欧美在线高清视频| 美女精品在线| 亚洲毛片在线观看.| 一本久久a久久免费精品不卡| 亚洲一区二区精品| 欧美诱惑福利视频| 欧美成人嫩草网站| 欧美午夜a级限制福利片| 国产精品视频九色porn| 精品av久久707| 亚洲男女自偷自拍| 麻豆精品在线视频| 亚洲一区亚洲| 欧美成人三级在线| 国产精品夜夜夜一区二区三区尤| 国产日韩欧美综合精品| 亚洲美女区一区| 久久久久九九九| 99热精品在线| 久久综合中文| 韩国在线视频一区| 香蕉久久一区二区不卡无毒影院 | 亚洲视频一区二区| 欧美成人一区二区三区| 亚洲一区影音先锋| 国产精品久久久久久久7电影| 在线观看日韩www视频免费| 欧美在线网站| 亚洲男人的天堂在线| 国产精品美女久久久久久2018| 91久久精品网| 久久激情视频免费观看| 亚洲国产毛片完整版| 美女脱光内衣内裤视频久久影院| 免费日韩av| 欧美成人免费网站| 亚洲特色特黄| 亚洲欧美久久| 国内自拍亚洲| 亚洲电影免费观看高清完整版| 裸体一区二区| 在线亚洲电影| 欧美在线免费观看视频| 亚洲第一精品夜夜躁人人躁| 欧美成人国产| 欧美午夜在线| 狼人天天伊人久久| 国产精品video| 麻豆成人av| 欧美午夜视频| 看欧美日韩国产| 欧美先锋影音| 亚洲国产乱码最新视频| 国产一区亚洲一区| 这里只有精品视频在线| 在线免费观看成人网| aa国产精品| 亚洲欧洲精品一区二区三区波多野1战4| 最新国产の精品合集bt伙计| 国产区亚洲区欧美区| 一本久久a久久免费精品不卡| 国产综合18久久久久久| 亚洲网站视频福利| 亚洲男女自偷自拍| 欧美劲爆第一页| 亚洲激情在线观看| 91久久黄色| 免费观看在线综合| 亚洲成色最大综合在线| 在线看一区二区| 欧美在线观看网址综合| 久久久五月天| 极品尤物久久久av免费看| 久久av一区二区三区漫画| 欧美一区二区高清| 国产一区二区按摩在线观看| 欧美一级网站| 欧美国产精品劲爆| 亚洲系列中文字幕| 亚洲国产影院| 欧美日韩国产影片| 亚洲成色www久久网站| 国产欧美一区二区精品性| 亚洲伦理自拍| 一区二区久久久久| 欧美日韩成人一区|