親手打造一個背景執行的Daemon程式

這是我在過去在 Linux 上撰寫微型 Web Server 時的筆記,目的是要讓我的程式能夠在背景執行,也就是要寫所謂的 Daemon 程式。關於 Daemon 的解釋,中文有人翻做『守護神程式』,若是對照在 DOS/Windows 系統底下的講法,就是所謂的『常駐程式』了。

Daemon 要怎麼寫呢?簡單來說:
使用系統呼叫 fork(),在背景複製一個自己繼續活下去,然後讓母體自我終結。


以下是一個簡單的範例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void main(void)
{
pid_t pid;
pid = fork();

if (pid>0) {
exit(0);
}

while(1) {
/* 子程式在系統背景跑無限迴圈 */
}
}

使用 fork() 後會回傳一個 pid 值,也就是行程處理 ID,這 ID 如果『小於零』,代表作業系統有問題令 fork() 失敗,無法複製生成一個新的程序。但是如果 fork 成功,會回傳零或是大於零的數字。

複製自己成功以後,需要了解的是,我們的程式有兩個正在執行,一個是母體,一個是剛被複製出來的子程式。或許你也注意到了,目前正在跑的程式是完全一樣的,要怎麼讓程式自己發現自己是本尊還是分身?關於這個問題,我們可以使用 pid 來判斷:如果得到的 pid 是『大於零』就是母體;得到『等於零』就是子程式。然後,只要讓母體自我終結就好,從範例中可以看到這段的程式判斷。

後記

這有點像電影『魔鬼複製人』的情節,在程式被複製成功以後,就告知本尊:『你該死去了。』對人來說,這是件很悲哀的事,尤其是對被複製的本尊來說。以後電腦開機前,想想你這一次的開機,會殺死多少生命,或許你就不願開機了﹝笑﹞。

留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄