一、單例程序
檔案鎖主函式
二、單例守護程序
/* 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守護程序情況下,如果同時有多個例項執行,那麼每個副本都可能試圖開始某個預定的操作,於是造成該操作的重複執行,這很可能導致出錯。如果守護程序需要訪問一裝置,而該裝...