以前我們在看《unix環境高階程式設計》的時候,有專門的整章詳細介紹如何編寫乙個後台daemon程式(精靈程式),主要涉及到建立會話組,切換工作目錄,設定檔案遮蔽字,關閉不必要的描述符等多個操作。這些操作對於每乙個後台程式來說都是類似的。
在linux中專門提供了乙個函式來完成這個daemon化的過程,這個函式的原型如下
int daemon (int __nochdir,
int __noclose)
;
如果__nochdir的值為0,則將切換工作目錄為根目錄;如果__noclose為0,則將標準輸入,輸出和標準錯誤都重定向到/dev/null。
經過這個函式呼叫後的程式將執行在後台,成為乙個daemon程式,而linux下大多的服務都是以此方式執行的。
我們來看乙個簡單的例子。例如編寫例子程式test.c
#include#include
int do_sth(
)int main(
)}
編譯並執行:
whc@ubuntu:~/test$ gcc -wall test.c -o www
whc@ubuntu:~/test$ ./www
程式進入後台,通過ps檢視程序情況,可以看到程序的父程序的id為1,即為init程序
whc@ubuntu:~/test$ ps -elf | grep www5 s www-data 20173 6295 0 80 0 - 6038 - 05:04 ? 00:00:00 /usr/sbin/apache2 -k start
1 s whc 26721 1 0 80 0 - 390 - 10:14 ? 00:00:00 ./www
0 r whc 26752 26657 0 80 0 - 805 - 10:15 pts/4 00:00:00 grep www
用lsof檢視www程序所開啟的檔案,可以看到檔案描述符0,1,2都被重定向到/dev/null
whc@ubuntu:~/test$ /usr/bin/lsof -p 26721command pid user fd type device size node name
www 26721 whc cwd dir 8,1 4096 2 /
www 26721 whc rtd dir 8,1 4096 2 /
www 26721 whc txt reg 8,3 6491 101021 /home/whc/weihua_work/守護程序/www
www 26721 whc mem reg 8,1 1364388 458293 /lib/tls/i686/cmov/libc-2.7.so
www 26721 whc mem reg 8,1 109152 432499 /lib/ld-2.7.so
www 26721 whc 0u chr 1,3 6448 /dev/null
www 26721 whc 1u chr 1,3 6448 /dev/null
www 26721 whc 2u chr 1,3 6448 /dev/null
並且能後看到,程序的當前工作目錄(cwd)為根目錄 '/',daemon函式已經幫助我們完成了daemon化的過程接下來我們只需關注程式功能的實現就可以了
編寫服務程式
編寫服務程式會用到這些函式 服務主函式 servicemain startservicectrldispatcher dispatcher n.排程員 計 排程程式 計 分配器 服務控制處理函式 servicectrlhandle registerservicectrlhandle 首先建立乙個wi...
Windows服務程式編寫
windows服務程式編寫 2014年8月17日16 08 55 1 用vs2008新建乙個空的控制台工程。如下 include include ifdef unicode define t s l s else define t s s endif define sleep time 5000 間...
windows服務程式的編寫
windows服務程式可以設定為開機執行,具有特權。乙個服務程式編寫完成後要進行安裝,然後通過本地服務的管理工具開啟,當然如果設定為開機自動執行就不用手動開啟了。服務程式不應該雙擊執行。windows服務程式需要進行安裝,也可以在服務程式的入口函式接收傳入的引數,然後進行判斷是否進行安裝,判斷接收的...