LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1004|回复: 1

如何把自己的daemon添加到系统服务中?

[复制链接]
发表于 2005-8-2 10:38:36 | 显示全部楼层 |阅读模式
我自己写了一个简单的daemon,运行基本良好。现在希望把它加入到
系统服务中,以便每次能够自动启动等。我先把它拷贝到/etc/init.d/
然后运行
# chkconfig --add exampled
结果出现:exampled 服务不支持chkconfig
我试着运行了一下vsftpd等daemon,--add, --del, 等都是没有问题
的,请问应该在我的代码中加上什么?谢谢。

我的daemon大致跟下面这个example类似:
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>

#define RUNNING_DIR   "/tmp"
#define LOCK_FILE   "exampled.lock"
#define LOG_FILE   "exampled.log"

void log_message(filename,message)
char *filename;
char *message;
{
FILE *logfile;
  logfile=fopen(filename,"a");
  if(!logfile) return;
  fprintf(logfile,"%s\n",message);
  fclose(logfile);
}

void signal_handler(sig)
int sig;
{
  switch(sig) {
  case SIGHUP:
     signal(SIGHUP,signal_handler);
     log_message(LOG_FILE,"hangup signal catched");
     break;
  case SIGTERM:
     log_message(LOG_FILE,"terminate signal catched");
     exit(0);
     break;
  }
}

void daemonize()
{
int i,lfp;
char str[10];
  if(getppid()==1) return; /* already a daemon */
  i=fork();
  if (i<0) exit(1); /* fork error */
  if (i>0) exit(0); /* parent exits */
  /* child (daemon) continues */
  setsid(); /* obtain a new process group */
  for (i=getdtablesize();i>=0;--i) close(i); /* close all descriptors */
  i=open("/dev/null",O_RDWR); dup(i); dup(i); /* handle standart I/O */
  umask(027); /* set newly created file permissions */
  chdir(RUNNING_DIR); /* change running directory */
  lfp=open(LOCK_FILE,O_RDWR|O_CREAT,0640);
  if (lfp<0) exit(1); /* can not open */
  if (lockf(lfp,F_TLOCK,0)<0) exit(0); /* can not lock */
  /* first instance continues */
  sprintf(str,"%d\n",getpid());
  write(lfp,str,strlen(str)); /* record pid to lockfile */
  signal(SIGCHLD,SIG_IGN); /* ignore child */
  signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
  signal(SIGTTOU,SIG_IGN);
  signal(SIGTTIN,SIG_IGN);
  signal(SIGHUP,signal_handler); /* catch hangup signal */
  signal(SIGTERM,signal_handler); /* catch kill signal */
}

main()
{
  daemonize();
  while(1) sleep(1); /* run */
}
 楼主| 发表于 2005-8-2 11:36:18 | 显示全部楼层
搞定了,原来/etc/init.d/中都是存放shell脚本,接受start/stop/restart等参数,
从它来启动真正的daemon,之前有点理解错了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表