Pages

2009年2月25日 星期三

Daemon

  Daemon 似乎不需要像 windows service 一樣去註冊,只要讓他開機自動執行即可,而他滿足幾項特性:
  1. 開機後即不斷執行。
  2. 父程序為 init。
  3. 不具有 tty (所以printf是幫不了你)。
  4. 執行者為 root (所以和他通訊的程序也必須是 superuser 所執行)。##ReadMore##

  在「Advanced Programming in the UNIX Environment」一書中提到撰寫 daemon 的規則,不過我也沒遵守,因為不了解這些規則的重要性,不過還是簡單列出該書所提到的部份:
  1. 需呼叫 fork,且父程序直接 exit。
  2. 呼叫 setsid。
  3. 改變工作目錄為「/」。
  4. 把 umask 設定為「0」,避免繼承來的遮罩導致檔案權限不如預期。
  5. 關閉無用的 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 是重新開機會執行的。

沒有留言:

 
Blogger Templates