Linux/Unix下pid檔案作用淺析(轉)
http://www.linuxeden.com/html/security/20121228/133780.html
(1) pid檔案的內容:pid檔案為文字檔案,內容只有一行, 記錄了該程式的ID。
用cat命令可以看到。
(2) pid檔案的作用:防止程式啟動多個副本。只有獲得pid檔案(固定路徑固定檔名)寫入許可權(F_WRLCK)的程式才能正常啟動並把自身的PID寫入該檔案中。其它同一個程式的多餘程式則自動退出。
(3) 程式設計技巧:
呼叫fcntl設定pid檔案的鎖定F_SETLK狀態,其中鎖定的標誌位F_WRLCK。
如果成功鎖定,則寫入程式當前PID,程式繼續往下執行。
如果鎖定不成功,說明已經有同樣的程式在執行了,當前程式結束退出。
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
if (fcntl(fd, F_SETLK, &lock) < 0){
//鎖定不成功, 退出......
}
sprintf (buf, "%d\n", (int) pid);
pidsize = strlen(buf);
if ((tmp = write (fd, buf, pidsize)) != (int)pidsize){
//寫入不成功, 退出......
}
(4) 一些注意事項:
i) 如果程式退出,則該程式加的鎖自動失效。
ii) 如果程式關閉了該檔案描述符fd, 則加的鎖失效。(整個程式執行期間不能關閉此檔案描述符)
iii) 鎖的狀態不會被子程式繼承。如果程式關閉則鎖失效而不管子程式是否在執行。
(Locks are associated with processes. A process can only have one kind of lock set for each byte of a given file. When any file descriptor for that file is closed by the process, all of the locks that process holds on that file are released, even if the locks were made using other descriptors that remain open. Likewise, locks are released when a process exits, and are not inherited by child processes created using fork.)
(5) 參考資料:
fcntl(檔案鎖)
表標頭檔案 #include
#include
函式定義int fcntl(int fd, int cmd, struct flock *lock);
函式解釋fd:檔案描寫符
設定的檔案描寫符,引數cmd代表欲壟斷的號召
F_DUPFD
複製引數fd的檔案描寫符,厲行獲勝則歸來新複製的檔案描寫符,
F_GETFD
獲得close-on-exec符號,若些符號的FD_CLOEXEC位為0,代表在呼叫
exec()相干函式時檔案將不會關閉
F_SETFD 設定close-on-exec符號,該符號以引數arg的 FD_CLOEXEC位定奪
F_GETFL獲得open()設定的符號
F_SETFL改換open()設定的符號
F_GETLK獲得檔案鎖定的事態,依據lock的描寫,定奪是否上檔案鎖
F_SETLK設定檔案鎖定的事態,此刻flcok,構造的l_tpye值定然是F_RDLCK、F_WRLCK或F_UNLCK,
萬一無法發生鎖定,則歸來-1
F_SETLKW 是F_SETLK的阻塞版本,在無法獲得鎖時會進去睡眠事態,萬一能夠獲得鎖可能捉拿到訊號則歸來
引數lock指標為flock構造指標定義如下
struct flock {
...
short l_typejngaoy.com;
short l_whence;
off_t l_start; 鎖定區域的開關位置
off_t l_len; 鎖定區域的大小
pid_t l_pid; 鎖定動作的歷程
...
};
1_type有三種事態:
F_RDLCK讀取鎖(分享鎖)
F_WRLCK寫入鎖(排斥鎖)
F_UNLCK解鎖
l_whence也有三種措施
SEEK_SET以檔案開始為鎖定的起始位置
SEEK_CUR以現在檔案讀寫位置為鎖定的起始位置
SEEK_END以檔案尾為鎖定的起始位置
歸來值 獲勝則歸來0,若有訛謬則歸來-1
l_len:加鎖區的長度
l_pid:具有阻塞目前歷程的鎖,其持有歷程的歷程號儲藏在l_pid中,由F_GETLK歸來
等閒是將l_start設定為0,l_whence設定為SEEK_SET,l_len設定為0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-751825/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- UNIX系統下各檔案的作用(轉)
- Linux系統下/proc/[pid] 目錄各檔案簡析Linux
- unix下複製檔案(轉)
- 淺析檔案上傳漏洞
- APK檔案淺析-AndroidAPKAndroid
- Linux安裝淺析(轉)Linux
- HTML檔案HEAD內部標記淺析(轉)HTML
- Unix與FreeBSD下檔案的屬性(轉)
- Linux 環境下 Makefile 檔案製作淺談(一)(轉)Linux
- Linux 環境下 Makefile 檔案製作淺談(二)(轉)Linux
- Android 檔案儲存淺析Android
- java中的JAR檔案淺析JavaJAR
- 淺析 App_KEY 的作用APP
- DOS/Windows和Linux/Unix間檔案格式轉換WindowsLinux
- linux下主要檔案(轉)Linux
- UNIX下讓ORACLE定時執行*.sql檔案(轉)OracleSQL
- unix口令檔案介紹(轉)
- UNIX的檔案處理(轉)
- UNIX 中的檔案切割(轉)
- 淺談Linux的檔案系統(轉)Linux
- 淺析Mysql的my.ini檔案MySql
- 利用securt crt下載linux或者unix檔案到windowsLinuxWindows
- Linux/Unix平臺可執行檔案格式分析(轉)Linux
- 【Linux】淺析檔案屬性與許可權相關命令Linux
- 淺析 Linux 的共享記憶體與 tmpfs 檔案系統Linux記憶體
- 淺析反向代理的原理與作用
- linux下的檔案共享(轉)Linux
- Unix 下批量解壓zip檔案
- mysql之pid檔案MySql
- Linux下把sra檔案轉成fastq檔案LinuxAST
- [下載]PHP 5.1.2 for Unix/Linux(轉)PHPLinux
- [轉載]淺析.NET Framework對PE檔案格式的擴充套件Framework套件
- linux 標頭檔案 作用Linux
- 在linux及unix系統下批次刪除oracle檔案LinuxOracle
- unix freebsd 配製檔案(轉)
- 轉載hp--unix下檔案系統的擴充套件套件
- linux/unix xfs大檔案系統Linux
- linux檔案系統簡析Linux