守護程序之單例項

2021-08-21 10:12:07 字數 3497 閱讀 8768

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* 建立守護程序函式 */

intdaemonize

()

/* 重定向標準輸入/標準輸出和標準錯誤輸出 */

error = open(

0600);

dup2(error,

2);close(error);

in = open(

"./stdin", o_rdonly|o_creat,

0600);

dup2(in,

0);close(in);

out = open(

0600);

dup2(out,

1);close(out);

/* 可以改變工作目錄 */

/* chdir("/"); */

/* 重設檔案建立掩模 */

umask(

0);/* 忽略sigchld訊號, 防止殭屍程序 */

signal(sigchld, sig_ign);

return

0;

}

/* 單例項實現, 成功返回0, 失敗程式退出, 列印錯誤或已執行程序號 */

intalready_running

(const

char *szlockfilepath)

;

fd = open(szlockfilepath, o_rdwr|o_creat, s_irusr|s_iwusr|s_irgrp|s_iroth);

if (fd <

0)/* 嘗試獲取檔案鎖 */

struct

flock

fl;

memset(&fl,

0x00,

sizeof(struct flock));

if (fcntl(fd, f_getlk, &fl) <

0)if (fl.l_type != f_unlck)

fl.l_whence = seek_set;

/* 決定l_start的位置 */

fl.l_start =

0; /* 設定鎖定區域開頭位置 */

fl.l_len =

0; /* 設定鎖定區域長度 */

fl.l_type = f_wrlck;

/* 設定鎖定狀態為寫鎖 */

fl.l_pid = getpid();

/* 設定鎖程序號 */

/* 阻塞式加鎖 */

if (fcntl(fd, f_setlk, &fl) <

0)/* 把程序號寫入檔案 */

ftruncate(fd,

0);memset(szbuf,

0x00,

sizeof(szbuf));

sprintf(szbuf,

"%ld", (

long)getpid());

write(fd, szbuf,

strlen(szbuf)+

1);return

0;

}

intmain

(void)

return

0;

} #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* 建立守護程序函式 */

intdaemonize

()

/* 重定向標準輸入/標準輸出和標準錯誤輸出 */

error = open(

0600);

dup2(error,

2);close(error);

in = open(

"./stdin", o_rdonly|o_creat,

0600);

dup2(in,

0);close(in);

out = open(

0600);

dup2(out,

1);close(out);

/* 可以改變工作目錄 */

/* chdir("/"); */

/* 重設檔案建立掩模 */

umask(

0);/* 忽略sigchld訊號, 防止殭屍程序 */

signal(sigchld, sig_ign);

return

0;

}/* 單例項實現, 成功返回0, 失敗程式退出, 列印錯誤或已執行程序號 */

intalready_running

(const

char *szlockfilepath)

;

fd = open(szlockfilepath, o_rdwr|o_creat, s_irusr|s_iwusr|s_irgrp|s_iroth);

if (fd <

0)/* 嘗試獲取檔案鎖 */

struct

flock

fl;

memset(&fl,

0x00,

sizeof(struct flock));

if (fcntl(fd, f_getlk, &fl) <

0)if (fl.l_type != f_unlck)

fl.l_whence = seek_set;

/* 決定l_start的位置 */

fl.l_start =

0; /* 設定鎖定區域開頭位置 */

fl.l_len =

0; /* 設定鎖定區域長度 */

fl.l_type = f_wrlck;

/* 設定鎖定狀態為寫鎖 */

fl.l_pid = getpid();

/* 設定鎖程序號 */

/* 阻塞式加鎖 */

if (fcntl(fd, f_setlk, &fl) <

0)/* 把程序號寫入檔案 */

ftruncate(fd,

0);memset(szbuf,

0x00,

sizeof(szbuf));

sprintf(szbuf,

"%ld", (

long)getpid());

write(fd, szbuf,

strlen(szbuf)+

1);return

0;

}int

main

(void)

return

0;

}

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

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

守護程序的單例項實現

守護程序的單例項實現 為了正常工作,守護程序應該實現為單例項的,也就是在任一時刻只執行該守護程序的乙個副本,因為這個守護程序要排它的訪問乙個裝置。這裡需要用到文 件鎖的機制,如果守護程序建立乙個檔案,並且在整個檔案上加上一把鎖,那就只允許建立一把這樣的寫鎖,在此之後如果試圖再建立一把這樣的寫鎖就將失...

守護程序之守護程序的慣例

在unix系統中,守護程序遵循下列公共慣例 例項 程式清單13 3所示程式說明了守護程序可以重讀其配置檔案的一種方法。該程式使用sigwait以及多執行緒 可參考 程式清單13 3 守護程序重讀配置檔案 include apue.h include include sigset t mask ext...