linux 編寫服務程式

2021-05-22 19:48:49 字數 1883 閱讀 7815

以前我們在看《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 www

5 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 26721

command   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服務程式需要進行安裝,也可以在服務程式的入口函式接收傳入的引數,然後進行判斷是否進行安裝,判斷接收的...