Linux/Unix下pid檔案作用淺析(轉)

myownstars發表於2012-12-28

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章