問題描述
守護程序是乙個脫離中斷執行在後台為系統提供某種服務的特殊程序;但這樣的服務一般不需要兩個,因而需要賦予他只能執行一次的屬性。
解決方案
使用最普通的方法:在執行時建立乙個特殊的標誌檔案,結束時關閉並刪除檔案,執行過程中如果再次執行,建立檔案是會報錯並退出。如此即可實現只能執行一次的屬性;
方案細節
建立daemon
(1) fork子程序,退出父程序;
(2)使用setsid()建立會話期,脫離控制台;
(3)chdir()工作目錄設為 「/」 ;
(4)umask()設定umask=0;
(5)遍歷fd並關閉所有檔案;
(6)繫結標準輸入、輸出、錯誤為「」/dev/null「;
自定義型號sigusr1處理函式並設定為結束前刪除標誌檔案
注意前後順序
(1)建立守護程序在程式最前面;
(2)建立標誌檔案;
(3)設定訊號處理;
(4)以上過程都要在daemon死迴圈之前;
所有輸出資訊全部寫在日誌檔案裡
示例**
#include
#include
#include
#include
#include
#include
#include
#include
#include
void
creat_daemon
(void);
void
func
(int sig)
;int
main
(void
)struct sigaction act =
; act.sa_handler = func;
sigaction
(sigusr1,
&act,
null);
openlog
("daemon"
, log_cons | log_pid, log_user)
;syslog
(log_info,
"the daemon has been run successfully\n");
closelog()
;while(1
)return0;
}void
func
(int sig)
}void
creat_daemon
(void
)else
if(pid >0)
pid =
setsid()
;if(pid <0)
chdir
("/");
umask(0
);int cnt =
sysconf
(_sc_open_max)
;int i =0;
for(i=
0; i)open
("/dev/null"
, o_rdwr)
;open
("/dev/null"
, o_rdwr)
;open
("/dev/null"
, o_rdwr)
;}
程式測試
檢視目錄: ls 結果是b.txt不存在
首次執行: ./b.out
控制台: null
檢視目錄: ls 結果是b.txt存在
檢視程序: ps -x
3715
? s 0:00
[kworker/u16:3]
3719
? s 0:00
[kworker/u16:1]
3742
? ss 0:00
./b.out
3743 pts/
16 r+0:
00 ps -x
檢視日誌:vi /var/log/syslog
2004 sep 108:
51:53 ubuntu daemon[
3742
]: the daemon has been run successfully
2005 sep 108:
51:53 ubuntu daemon[
3742
]: cnt =
0.2006 sep 108:
51:54 ubuntu daemon[
3742
]: cnt =
1.2007 sep 108:
51:55 ubuntu daemon[
3742
]: cnt =
2.2008 sep 108:
51:56 ubuntu daemon[
3742
]: cnt =
3.2009 sep 108:
51:57 ubuntu daemon[
3742
]: cnt =
4.2010 sep 108:
51:58 ubuntu daemon[
3742
]: cnt =
5.2011 sep 108:
51:59 ubuntu daemon[
3742
]: cnt =
6.
再次執行:./b.out
3657
? s 0:00
[kworker/u16:0]
3715
? s 0:00
[kworker/u16:3]
3742
? ss 0:00
./b.out
3745
? s 0:00
[kworker/u16:1]
3750 pts/
16 r+0:
00 ps -x
只有乙個b.out程序
檢視日誌:
2258 sep 108:
56:06 ubuntu daemon[
3742
]: cnt =
253.
2259 sep 108:
56:07 ubuntu daemon[
3749
]: this process is running and can not be run again.
2260 sep 108:
56:07 ubuntu daemon[
3742
]: cnt =
254.
2261 sep 108:
56:08 ubuntu daemon[
3742
]: cnt =
255.
結束程序:kill -10 3742
控制台:null
檢視目錄:ls j結果是b.txt不存在
檢視程序:ps -x
3745
? s 0:00
[kworker/u16:1]
3755
? s 0:00
[kworker/u16:0]
3762 pts/
16 r+0:
00 ps -x
檢視日誌:
3179 sep 109:
11:28 ubuntu daemon[
3742
]: cnt =
1173.
3180 sep 109:
11:29 ubuntu daemon[
3742
]: cnt =
1174.
3181 sep 109:
11:29 ubuntu daemon[
3742
]: the daemon has been terminated.
總結
以上示例便是實現了乙個只能執行一次的守護程序
linux守護程序實現
守護 daemon 程序即在後台執行的程序,網上有很多介紹守護程序的文章,這裡不再贅述,直接上 static void daemon prep int stderr log just in case.open dev null o rdwr dup 0 dup 0 static int daemon...
PHP實現守護程序方式,Linux後台執行
linux後台執行程式,nohup 和 結合使用 使用 後台執行程式 使用nohup執行程式 缺點 依賴終端 此時使用fg命令可以恢復前台執行 ps 後台程序並未完全脫離終端,在終端未關閉前還是會往終端輸出結果,後台程式會隨shell退出而停止 缺點 占用終端 用途 不結束通話地執行命令,即使終端s...
PHP實現守護程序方式,Linux後台執行
linux後台執行程式,nohup 和 結合使用 使用 後台執行程式 使用nohup執行程式 缺點 依賴終端 此時使用fg命令可以恢復前台執行 ps 後台程序並未完全脫離終端,在終端未關閉前還是會往終端輸出結果,後台程式會隨shell退出而停止 缺點 占用終端 用途 不結束通話地執行命令,即使終端s...