1. 程式人生 > 其它 >Linux下避免程式被重複執行

Linux下避免程式被重複執行

技術標籤:C/C++Linux嵌入式

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。