Linux下避免程式被重複執行
阿新 • • 發佈:2021-01-06
Linux下避免程式被重複執行
目標
在Linux下,有些程式同時執行多個例項時會出錯。因此,需要使用一些方法避免程式被重複執行,即同一時間段內只能有一個程式例項執行。
思路
程式啟動的時候開啟某個鎖檔案並對該檔案加鎖,退出程式時解鎖。
如果無法正常加鎖,則說明程式已經在記憶體中運行了,當前執行緒return即可。
程式碼實現
首先,先以建立+可讀寫模式開啟鎖檔案temp.lock(可自行定義檔名)
之後使用flock檔案對檔案加鎖,如果加鎖失敗,檢查errno是否為EWOULDBLOCK。如果是則說明已經有程序持鎖,即程式已經有例項在執行。
否則持鎖並繼續邏輯。
檢測程式碼如下:
int isProcessRunning()
{
lock_fd = open("temp.lock",O_CREAT|O_RDWR,0666);
int rc = flock(lock_fd,LOCK_EX|LOCK_NB); //flock加鎖,LOCK_EX -- 排它鎖;LOCK_NB -- 非阻塞模式
if(rc) //返回值非0,無法正常持鎖
{
if(EWOULDBLOCK == errno) //嘗試鎖住該檔案的時候,發現已經被其他服務鎖住,errno==EWOULDBLOCK
{
printf ("Already Running!\n");
return -1;
}
}
return 0;
}
在main函式中,只需檢測返回值不為0退出即可。
if(isProcessRunning())
return 0;
備註:
flock函式:
標頭檔案 #include<sys/file.h>
函式原型 int flock(int fd,int operation);
引數 operation有下列四種情況:
LOCK_SH 建立共享鎖定。多個程序可同時對同一個檔案作共享鎖定。
LOCK_EX 建立互斥鎖定。一個檔案同時只有一個互斥鎖定。
LOCK_UN 解除檔案鎖定狀態。
LOCK_NB 無法建立鎖定時,此操作可不被阻斷,馬上返回程序。通常與LOCK_SH或LOCK_EX 做OR(|)組合。
返回值 返回0表示成功,若有錯誤則返回-1,錯誤程式碼存於errno。