首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

ubuntu下Daemon如何自动启动

2009-02-07 
C++基础

    以ubuntu为例(ubuntu为debian的分支,所以系统编程和配置极为相似),
  代码如下
  //mydaemon.c
  #include<unistd.h>
  #include<stdlib.h>
  #include<sys/param.h>
  #include<sys/types.h>
  #include<sys/stat.h>
  void init_daemon(void)
  {
  int pid;
  int i;
  if(pid=fork())
  exit(0);
  else if(pid<0)
  exit(1);
  //是第一子进程
  setsid();//第一子进程成为新的会话组长和进程组长, 并与控制终端分离
  if(pid=fork())
  exit(0);//结束第一子进程
  else if(pid< 0)
  exit(1);
  //第二子进程不再是会话组长
  for(i=0;i< NOFILE;++i)//关闭打开的文件描述符
  close(i);
  chdir("/");//改变工作目录到/
  umask(0);//重设文件创建掩模
  return;
  }
  int main()
  {
  init_daemon();//使进程成为Daemon
  //以下可以添加功能代码
  while(1)
  {
  sleep(10);//睡眠一分钟
  }
  return 0;
  }
  输入命令
  gcc mydaemon.c -o mydaemon
  ./mydaemon
  如果成功,可以用ps -efjc查看,我们会发现这个进程的父进程为init,到这里守护进程成功运行,
  许多Daemon如ftpd, httpd都设为开机自动运行,下面讨论如何通过添加脚本让系统来启动Daemon,根据系统初始化原理一文(本blog已转载)介绍,
  我在/etc/init.d/中添加一个新建一个脚本,为mydaemon, 脚本如下,假设我的daemon目录为/home/eyesmart/Daemon
  #! /bin/sh
  # /etc/init.d/mydaemon: start the my daemon.
  PATH=/bin:/usr/bin:/sbin:/usr/sbin
  binpath=/home/eyesmart/Daemon/mydaemon
  test -f $binpath || exit 0
  . /lib/lsb/init-functions
  case "$1" in
  start)
  log_begin_msg "Starting mydaemon..."
  start-stop-daemon --start --quiet--exec $binpath
  log_end_msg $?
  ;;
  stop)
  log_begin_msg "Stopping mydaemon..."
  start-stop-daemon --stop --retry TERM/1/TERM/1/TERM/4/KILL --quiet --oknodo--exec $binpath
  log_end_msg $?
  ;;
  restart|force-reload)
  $0 stop
  sleep 1
  $0 start
  ;;
  *)
  log_success_msg "Usage: $binpath {start|stop|restart|force-reload}"
  exit 1
  esac
  exit 0
  大致是这样,脚本可以按需要写的再细致些,做到这里按说已经完成,但是unix有个run level这个特征,所以我们必须对于特定的run level创建一个链接,
  一般linux是运行level 2,那么我们输入下列命令ln -s /etc/init.d/mydaemon /etc/rc2.d/S50mydaemon.
  到这里大功告成,当你重启系统的时候你可以在开机过程中看到自己些的程序所显示的信息。
  其他Unix系统环境在细节上会有所不同,但原理一样。

 

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行