作業系統 單例程序 單例守護程序

2021-09-27 12:59:20 字數 2385 閱讀 2160

一、單例程序

檔案鎖主函式

二、單例守護程序

/* filelock.h */

#ifndef filelock_h

#define filelock_h

#include #include #include #include #include #include #include #include // fcntl函式的包裝,帶w表示阻塞呼叫

#define rd_lock(fd, offset, whence, len) lock_reg((fd), f_setlk, f_rdlck, (offset), (whence), (len))

#define wr_lock(fd, offset, whence, len) lock_reg((fd), f_setlk, f_wrlck, (offset), (whence), (len))

#define rdw_lock(fd, offset, whence, len) lock_reg((fd), f_setlkw, f_rdlck, (offset), (whence), (len))

#define wrw_lock(fd, offset, whence, len) lock_reg((fd), f_setlkw, f_wrlck, (offset), (whence), (len))

#define un_lock(fd, offset, whence, len) lock_reg((fd), f_setlk, f_unlck, (offset), (whence), (len))

// 被巨集使用,實現應該放在標頭檔案

int lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)

#endif

/*   */

#include #include #include #include #include #include #include "filelock.h"

#define lockfile "/tmp/single2.pid"

void oneprocess_running()

// 加建議性寫鎖,非阻塞加鎖,加鎖失敗返回-1

if (wr_lock(fd, 0, seek_set, 0) < 0)

// 檔案清零,只寫一次pid號

ftruncate(fd, 0);

snprintf(buf, 32, "%ld", (long)getpid());

write(fd, buf, strlen(buf)+1);

return;

}int main()

return 0;

}

#include #include #include #include #include #include #define lockfile "/tmp/single_deamon.pid"

void oneprocess_running()

// 建立乙個寫鎖

struct flock flk;

flk.l_type = f_wrlck; // 加寫鎖

flk.l_pid = getpid();

flk.l_start = 0;

flk.l_whence = seek_set;

flk.l_len = 0;

// 非阻塞加鎖

if (fcntl(fd, f_setlk, &flk) < 0)

// 檔案清零,只寫一次pid號

ftruncate(fd, 0);

snprintf(buf, 32, "%ld", (long)getpid());

write(fd, buf, strlen(buf)+1);

return;

}int main()else if(pid > 0)

// 新會話

setsid();

// 切換到子程序

pid = fork();

if(pid < 0)else if(pid > 0)

// 切換到根目錄

chdir("/");

// 更改檔案模式建立遮蔽字

umask(0);

// 關閉所有開啟的檔案描述符

int i;

for(i=0; i// 單例保證,放在後面,避免關閉了pid檔案描述符

oneprocess_running();

while(1)

return 0;

}

程序單例模式

不同於執行緒單例模式,很多時候我們希望乙個程式只有乙個例項在執行。常規的做法有建立乙個命名檔案,通過判斷這個檔案存在不存在來確定是否已經有程序例項啟動 更進一步,可以通過對檔案加鎖的方式,從而避免前面方法中需要在程式退出時刪除檔案的操作,但是檔案加鎖 需要檔案系統的支援。fat32等檔案系統不一定支...

windows下程序單例

有時候需要讓程序單例執行,以防止多個例項導致異常,windows下可以使用系統事件來實現,比如event mutex等,event和mutex在建立的時候如果物件已存在,getlasterror會返回error already exists,可以以此實現程序單例 handle createevent...

守護程序之單例項守護程序

為了正常執行,某些守護程序實現為單例項的,也就是在任一時刻只執行該守護程序的乙個副本。例如,該守護程序可能需要排它地訪問乙個裝置。在cron守護程序情況下,如果同時有多個例項執行,那麼每個副本都可能試圖開始某個預定的操作,於是造成該操作的重複執行,這很可能導致出錯。如果守護程序需要訪問一裝置,而該裝...