- 開機後即不斷執行。
- 父程序為 init。
- 不具有 tty (所以printf是幫不了你)。
- 執行者為 root (所以和他通訊的程序也必須是 superuser 所執行)。##ReadMore##
在「Advanced Programming in the UNIX Environment」一書中提到撰寫 daemon 的規則,不過我也沒遵守,因為不了解這些規則的重要性,不過還是簡單列出該書所提到的部份:
- 需呼叫 fork,且父程序直接 exit。
- 呼叫 setsid。
- 改變工作目錄為「/」。
- 把 umask 設定為「0」,避免繼承來的遮罩導致檔案權限不如預期。
- 關閉無用的 file descriptor。
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>
int daemon_init(void)
{
pid_t pid;
if((pid = fork()) < 0)
return -1;
else if(pid != 0)
exit(0);
setsid();
chdir("/");
umask(0);
return 0;
}
以上是本書的初使化範例,不論如何,都需要寫一個 script 讓開機自動啟動 daemon,這裡的作法是在 /etc/init.d/rc.local 去執行我寫的一個 script,當然只要在 rc2.d 中會執行到的 script 中加入都是可以的 [註]。以下列出 script 內容;
#!/bin/sh
[ -x /home/linly/DualView/daemon/Dualview-Daemon ] || exit 0
#filename=/home/linly/DualView/daemon/Dualview-Daemon
#test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0
case "$1" in
start)
# Start daemons.
cd /home/linly/DualView/daemon
./Dualview-Daemon &
;;
stop)
# Stop daemons.
chk=`/usr/bin/pgrep -x Dualview-Daemon`
if [ "$chk" ]; then
echo -n "Shutting down Dualview Daemon "
kill -9 $chk
fi
echo ""
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: Dualview-Daemon {start|stop|status|restart}"
exit 1
esac
cd /home/linly/DualView/uvcvideo
/sbin/rmmod uvcvideo
/sbin/insmod uvcvideo.ko
exit 0
開機後輸入 ps -ajx | grep "Dualview-Daemon" 會看到以下內容:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1 6038 5067 5067 ? -1 S 0 0:00 ./Dualview-Daemon
以我的 daemon 為例,由於 shared memory 擁有者是 root,所以權限不足是砍不掉的。而且需要用 signal 來通知 daemon 的應用程式,也必須是 superuser 所執行的應用程式。還有一點,如果需要印訊息,必須透過 syslog 這個 daemon 來達成(因為沒有終端機),以下列出相關的函式:
#include <syslog.h>
void openlog(char *ident, int option, int facility);
void syslog(int priority, char *format, ...);
void closelog(void);
執行時發生一個問題,就是 gtk_init 無法順利初始化,導致程式被中斷,嘗試很久後,採用 gtk_init_check,該函式即使出始化失敗也不會中斷程式,且能夠順利初使 gdk 的元件,有達到我的需求。(初使做了很多動作,也不知道掛在哪裡,反正我要用的東西有初始好就好拉:P)
注意事項:
- rc2.d 是一般開機進入圖形介面的過程中,會執行的腳本,像 rc0.d 就是關機會執行的;而 rc6.d 是重新開機會執行的。
沒有留言:
張貼留言