2011-10-04 96 views
10

我一直在尋找創建Unix守護進程,似乎有兩種方法。在囉嗦一句,這似乎拿出搜索時,爲再次調用fork()setsid()fork()chdir()到安全的地方,設置umask(),最後close()stdinstdoutstderr調用守護進程()和調用fork(),setsid(),fork()等有什麼區別?

但是,運行man daemon會提示有關daemon()函數的信息,這似乎與上面所做的內容完全相同。這兩種方法之間有什麼不同嗎?或者daemon()只是一個方便的功能,它和冗長的方法做同樣的事情?是一個更好的,特別是對於新手C程序員?

回答

19

daemon函數沒有在POSIX中定義,所以它的實現(如果有的話)可能在不同的平臺上有不同的表現。

在Linux上用glibc,daemon只做一個叉,可選chdir S(但僅限於/,你不能指定路徑),不觸及umask,並且不關閉std*描述符(它可選擇重新打開它們到/dev/null雖然)。 (source

所以它取決於平臺,並且至少有一個實現比你做的少。如果你需要所有你正在做的事情,堅持下去(或者堅持一個平臺,daemon函數就是這樣做的)。

+10

將文件描述符0,1和2打開​​到'/ dev/null'比關閉它們要好,因爲否則守護程序打開的下一個文件(日誌文件,套接字,...)將獲得這些文件描述符 - 可能會咬你,說當你打電話的某個庫決定寫一個錯誤到'stderr' ... – caf

+0

好的調用不關閉描述符0,1和2。 –

1

守護進程調用總結了冗長的fork過程,我不記得任何可以做更多事情的實現。

由於daemon()是一個高級概念,所以對於初學者和有經驗的程序員來說,它絕對是首選。

2

請注意daemon不符合任何標準。更好地使用符合標準的功能(如POSIX定義的forksetsid)。