一段演示flock系統呼叫的perl程式

2021-07-26 04:52:22 字數 1656 閱讀 5372

在用

perl

開發一些系統級軟體時,經常會遇到檔案鎖

的問題。為什麼要使用檔案鎖呢?舉乙個不是太恰當的例子:(注意,確實是不太恰當,但有助於理解)

街上的櫃員機(atm)同時只能

服務乙個人(資料來源),而如果有多個人(不同的程序)要取錢,存錢,則會形成衝突,怎麼

解決呢?假設櫃員機旁邊有乙個管理員(kernel),櫃員機只向持有有效許可(flock,檔案鎖)的人提供服務,而有效許可只有乙份,由管理員發放給申請需要使用atm的人。

此時假設有a,b,c三個人都要使用櫃員機,大家都向管理員提出申請(flock (fh, lock_ex) ),管理員根據先後,給最先發請求的人頒發授權(相當於將鎖給了這個人),假設是b,此時b獲得了授權(flock),可以使用桂員機,他用完之後告訴管理員他用完了(flock(fh, lock_un) ),此時管理員再將授權轉交給下乙個人a,a又獲得了授權(鎖,flock),繼續使用atm機器。。。

這個例子雖然不夠恰當,但基本將事情說清楚,需要注意的是lock_ex是表示排它鎖(exclude),是獨佔的,一般用於寫操作,而如果換成lock_sh(share)則是共享,多用於讀取。有時為了保證多程序對檔案的讀寫都是唯一的,無論讀寫都進行lock_ex的請求。

以下是一段演示程式,名叫flock.pl

[code]

use fcntl qw(:flock);

use posix qw(strftime);

open (fd, " < source.txt") or die "$!\n";

flock(fd, lock_ex);

print "yeah i get the lock by pid=$$ at ", cur_time(), "\n";

sleep 10;

flock(fd, lock_un);

print "oops i lose the lock by pid=$$ at ", cur_time(), "\n";

close fd;

sub cur_time

[/quote]

使用方法:

開啟2個控制台(console),假設分別為a視窗和b視窗,在a命令列下輸入:

perl flock.pl

此時會顯示:

yeah i get the lock by pid=6122 at 14:20:39

過2,3秒,在b控制台執行同樣的命令:

perl flock.pl

則暫時無任何顯示,等到a控制台的程式執行完畢,顯示:

oops i lose the lock by pid=6122 at 14:20:49

的時候,b控制台的程式立刻顯示:

yeah i get the lock by pid=6123 at 14:20:49

過10秒後程式結束並顯示:

oops i lose the lock by pid=6123 at 14:20:59

上述**及演示說明了排他鎖(lock_ex)是讓多程序序列的對資料來源進行操作。注意,這個演示裡的source.txt必須是實現存在的!。

重要的一段

2006 6 23 22 44 00 重要的一段 這幾個月都用在開發心電監護系統上了,終於告一段落,倍感輕鬆。欣慰的是,有了成果,並且成果正走在產品化路上。5月31日,孕育 設計監護儀樣機結構和pcb 6月7日,生日 pcb板製好,開始焊接和除錯 6月17日,tata,監護儀終於可以見人了。介紹一下...

忙碌的一段日子

最近不是一般的忙,在做lotus foundations 的售前資料,和maximo的售前產品研究。乙個是新推出的產品系列,乙個是未曾接觸過的高階資產管理軟體,maximo雖然被ibm收購,但技術尚未接管,這是個很大的麻煩,所以,我幾乎沒有什麼資料可查。都是從網上找來各種各樣的文章,資料,自己研究,...

一段新的旅程

不知道這麼多年天我是怎樣走過來的,似乎什麼都不知道,什麼都不清楚,就這樣一路撞到了今天。自從到了大學我以為我變了我更加開朗了更加活潑了和以前完全不一樣了變得越來越好了。可是,不過是以為而已。慢慢放下了筆,未竟的 再也沒有看下去。拿起了手機,未讀的書在手邊很少有興趣去翻閱。開啟了英雄聯盟,對著未完成 ...