Chinaunix

标题: 守护进程自己停掉的问题 [打印本页]

作者: jasonliu    时间: 2004-03-18 16:31
标题: 守护进程自己停掉的问题
各位老大,我写的一个守护进程经常会莫名其妙的没了,怎么回事呀?帮帮俺吧
作者: win_hate    时间: 2004-03-18 16:34
标题: 守护进程自己停掉的问题
dao.

more detail.
作者: jasonliu    时间: 2004-03-18 16:49
标题: 守护进程自己停掉的问题
server程序守护一个端口,accept成功以后就fork一个子进程去读执行程序名称然后EXECLP调起这个一个执行程序,这个执行程序继续从端口读取数据,并执行相关处理,处理完毕返回。
作者: zhongjl    时间: 2004-03-18 17:00
标题: 守护进程自己停掉的问题
兄弟,说明白点呀!
作者: xhl    时间: 2004-03-18 18:11
标题: 守护进程自己停掉的问题
这样写吧,这个模版应该不会出现你说的问题


volatile keep_going = 1; /* controls program termination */


/* Function prototypes: */

void termination_handler (int signum); /* clean up before termination */
       
int main (void)
{
int listenfd,clifd,i;
char HOME_DIR[30];
long pid;
struct sockaddr_in myaddr,cliaddr;
int ret;
int len;
strcpy(HOME_DIR,"/disk3/teach/html/support/server";
if (chdir (HOME_DIR))         /* change to directory containing data */
{
fprintf (stderr, "`%s': ", HOME_DIR);
perror (NULL);
exit (1);
}
/* Become a daemon: */
switch (fork ())
   {
    case -1:                    // can't fork
      perror ("fork()";
      exit (3);
    case 0:                     // child, process becomes a daemon:
       close (STDIN_FILENO);
       close (STDOUT_FILENO);
       close (STDERR_FILENO);
       if (setsid () = -1)      // request a new session (job control)
         {
           exit (4);
         }
       break;
     default:                    // parent returns to calling process:
       return 0;
   }

   /* Establish signal handler to clean up before termination: */
   if (signal (SIGTERM, termination_handler) = SIG_IGN)
     signal (SIGTERM, SIG_IGN);
   signal (SIGINT, SIG_IGN);
   signal (SIGHUP, SIG_IGN);

listenfd=socket(AF_INET,SOCK_STREAM,0);
    if (listenfd<0)
     {
      perror("socket error";
      exit(-1);
     }

    myaddr.sin_family=AF_INET;
    myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    myaddr.sin_port=htons(8895);        //port

    ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
    if (ret<0)
     {
      perror("bind error";
      exit(-1);
     }
    listen(listenfd,10);
    len=sizeof(struct sockaddr);
while(1)
     {
      clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);

      if(clifd=-1)
       {
        perror("accept error";
        continue;
        }
         
       
      switch(pid=fork())
       {
        case 0:
                    close(listenfd);
               
                 读写!
                      exit(0);
                   break;
        case -1:
           perror("fork error";
           break;
           default:
           close(clifd);
           break;

      }
   }

   close(listenfd);
   close(clifd);
   return 0;

   
}
void termination_handler (int signum)
{
  keep_going = 0;
  signal (signum, termination_handler);
}
作者: chenhao_no1    时间: 2004-03-19 08:51
标题: 守护进程自己停掉的问题
if the daemon died frequently,  place it into /etc/inittab
作者: jasonliu    时间: 2004-03-19 16:21
标题: 守护进程自己停掉的问题
不胜感激




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2