#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...