一般情況下,初始化都是從shell腳本完成的,這些腳本會調用您的C++程序,然後執行它的雙分叉。注意它也應該關閉不需要的文件描述符,使用setsid()和可能的setpgid/setpgrp(我不記得它們是否也適用於Linux),可能是chdir(「/」)等。有一些相當正常的在Stevens書中描述的事情 - 更多信息請參閱http://software.clapper.org/daemonize/daemonize.html
如果守護程序應該以root或其他系統用戶帳戶運行,那麼系統將使用/ etc/init /或/etc/init.d /機制是使腳本停止|開始|狀態|等守護進程的適當位置。
如果deamon應該是給用戶的,並在他/她的帳戶下運行,那麼您有幾個選項。 1).desktop文件 - 我個人不是粉絲,但是如果它在註銷時也爲你做了某些事情(比如讓你關閉守護進程),它可能是可行的。
2)對於控制檯登錄,〜/ .bash_login和〜/ .bash_logout - 你可以讓守護進程的包裝程序支持這些運行命令來啓動它並(稍後)將其關閉。後者可以通過將PID保存在文件中或讓.bash_login保存在.bash_logout將在以後使用的變量中完成。這可能涉及到一些調整,以確保兩個腳本每次運行一次,只有最外層的登錄shell(普通的.bashrc保留在.bashrc中,而.bash_login需要在之前爲登錄shell 讀入它)啓動守護進程,所以PATH等將在那時建立)。
3)對於圖形環境,您需要找到運行X窗口管理器等事情的包裝腳本。我正在使用lightdm,並且在某個時候/etc/X11/Xsession.d/40x11-common_xsessionrc最終運行了我的〜/ .xsessionrc,它給了我一個啓動任何我想要的東西的鉤子(我已經運行了我的〜/ .xinitrc其中運行我的窗口管理器和所有內容),以及稍後將所有內容拍攝下來的地方。由於缺乏用戶控制的標準化使得找到鉤子非常煩人,因爲只使用不同的登錄管理器(例如lightdm和gdb)可以改變鉤子的位置。
4)完全不同的方法是讓用戶的crontab啓動守護進程。運行「man 5 crontab」並查找特殊的@reboot選項以使任務在啓動時運行。我自己並沒有使用過它 - 它有一個根限制的機會,但它很容易測試,並且只需要考慮當系統發送一個SIGTERM信號時,系統關閉時守護進程會優雅(快速)存在(請參閱/ etc/init.d/sendsigs的細節)。
希望從中幫助。
您正在尋找_better_方式;請告訴我們在哪些方面可以採取不同的方式。更便攜?執行速度更快?較短的代碼?針對特殊情況更強大?其他方面? – Alfe
我不確定這是否是建議的方式。我是Linux編程新手,找不到任何關於以編程方式啓動守護進程的方法 – skaur
我看到的最常見的方法是,準備一個shell腳本,爲守護進程準備環境(導出env vars,創建日誌目錄等),然後在最後調用你的二進制文件。一旦你的可執行文件進入守護進程模式,檢查返回狀態後退出shell腳本 – Arunmu