免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1091 | 回复: 1
打印 上一主题 下一主题

如何调试一个daemon进程? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-01 09:58 |只看该作者 |倒序浏览
我的程序本来能正常运行,一把他变成daemon进程就出问题。
也就是程序开始调用了这个:
int
daemon_init(void)
{
        pid_t pid;

        if((pid=fork())<0)
                return(-1);
        else if(pid!=0)
                exit(0);
       
        setsid();                /* become session leader */
        chdir("/";                /* change working directory */
        umask(0);                /* clear file mode creation mask */
       
        return(0);
}
可能问题出在哪?我应当怎样进行调试呢?

论坛徽章:
0
2 [报告]
发表于 2005-01-01 20:15 |只看该作者

如何调试一个daemon进程?

帮楼主贴出全部代码?斑竹看一下。我们也学习一下。

  1. #include <sys/types.h>;
  2. #include <sys/stat.h>;
  3. #include <sys/socket.h>;
  4. #include <netinet/in.h>;
  5. #include <signal.h>;
  6. #include <fcntl.h>;
  7. #include <stdio.h>;
  8. #include <time.h>;
  9. #include <syslog.h>;
  10. #include <errno.h>;
  11. #include <stdarg.h>;

  12. #define        BUFFSIZE 4096
  13. #define TCP_SIZE 1460

  14. int        listenfd,clifd,maxfd;
  15. char        recvbuf[BUFFSIZE],key[BUFFSIZE],sendbuf[BUFFSIZE];

  16. int daemon_init(void);
  17. int sig_do(int);
  18. void sendinfo(int, char *);
  19. void log_open(const char *, int, int);
  20. void log_sys(const char *, ...);
  21. void log_msg(const char *, ...);
  22. static void log_doit(int, int, const char *, va_list ap);

  23. int
  24. main(void)
  25. {
  26.         struct sockaddr_in servaddr;

  27.         log_open("open.server",LOG_PID,LOG_USER);
  28.         daemon_init();

  29.         if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
  30.                 log_sys("socket error");
  31.         bzero(&servaddr,sizeof(servaddr));
  32.         servaddr.sin_family=AF_INET;
  33.         servaddr.sin_port=htons(80);
  34.         servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  35.         if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
  36.                 log_sys("bind error");
  37.         if(listen(listenfd,5)<0)
  38.                 log_sys("listen error");

  39.         signal(SIGIO,sig_do);
  40.         fcntl(listenfd,F_SETOWN,getpid());
  41.         fcntl(listenfd,F_SETFL,O_ASYNC);

  42.         for(;;);
  43.         exit(0);
  44. }

  45. int
  46. sig_do(int signo)
  47. {
  48.         struct sockaddr_in cliaddr;
  49.         socklen_t        addrlen;       
  50.         char *p;
  51.         int recvlen;

  52.         while(1){
  53.                 addrlen=sizeof(cliaddr);
  54.                 if((clifd=accept(listenfd,(struct sockaddr *)&cliaddr,&addrlen))<0)
  55.                         log_sys("accept error");
  56.                 while(1){
  57.                         if((recvlen=recv(clifd,recvbuf,sizeof(recvbuf),0))<0)
  58.                                 log_sys("recv error");
  59.                         else if(recvlen==0)
  60.                                 break;

  61.                         recvbuf[recvlen]=0;
  62.                         log_msg(recvbuf);

  63.                         if(strncmp(recvbuf,"GET",3)==0){        /* 判断请求类型是否为GET */
  64.                                 p=strchr(recvbuf+3,'/');        /* 在请求中"/"的匹配之处 */
  65.                                 if(p==0) break;
  66.                                 p++;
  67.                                 //if(*p==' ')
  68.                                 {
  69.                                         sendinfo(clifd,"./index.htm");
  70.                                         break;
  71.                                 }
  72.                         }else
  73.                                 log_sys("bad request");
  74.                 }
  75.                 close(clifd);
  76.         }
  77.         return;
  78. }

  79. void sendinfo(int sock,char *filename)
  80. {
  81.         char *sendDate,sendbuf[16384]="HTTP/1.0 200 OK\nServer: FreeBSD 4.7\n";
  82.         int len,pos,fd;
  83.         time_t tp;

  84.         tp=time(NULL);
  85.         sendDate=ctime(&tp);
  86.         strcat(sendbuf,sendDate);
  87.         strcat(sendbuf,"Content-Type: text/html\nConnection: close\n\n\n\n");
  88.         pos=0;
  89.         len=strlen(sendbuf);
  90.         if((fd=open(filename,O_RDONLY))<0)
  91.                 log_sys("open error");
  92.         len+=read(fd,sendbuf+len,sizeof(sendbuf)-len-1);

  93.         while(len>;0)                        /* 每次1460数据发给客户,直到sendbuf空 */
  94.         {
  95.                 send(sock,sendbuf+pos*TCP_SIZE,TCP_SIZE,0);
  96.                 len-=TCP_SIZE;
  97.                 pos++;
  98.         }
  99.         close(fd);
  100. }

  101. int
  102. daemon_init(void)
  103. {
  104.         pid_t pid;

  105.         if((pid=fork())<0)
  106.                 return(-1);
  107.         else if(pid!=0)
  108.                 exit(0);

  109.         setsid();                /* become session leader */
  110.         chdir("/");                /* change working directory */
  111.         umask(0);                /* clear file mode creation mask */

  112.         return(0);
  113. }

  114. void
  115. log_open(const char *ident, int option, int facility)
  116. {
  117.         openlog(ident,option,facility);
  118. }

  119. void
  120. log_msg(const char *fmt, ...)
  121. {
  122.         va_list                ap;

  123.         va_start(ap, fmt);
  124.         log_doit(0, LOG_ERR, fmt, ap);
  125.         va_end(ap);
  126.         return;
  127. }

  128. void
  129. log_sys(const char *fmt, ...)
  130. {
  131.         va_list        ap;

  132.         va_start(ap,fmt);
  133.         log_doit(1,LOG_ERR,fmt,ap);
  134.         va_end(ap);
  135.         exit(2);
  136. }

  137. static void
  138. log_doit(int errnoflag, int priority, const char *fmt, va_list ap)
  139. {
  140.         int        errno_save;
  141.         char        buf[BUFFSIZE];

  142.         errno_save=errno;
  143.         vsprintf(buf,fmt,ap);
  144.         if(errnoflag)
  145.                 sprintf(buf+strlen(buf),":%s",strerror(errno_save));
  146.         strcat(buf,"\n");
  147.         syslog(priority,buf);
  148.         return;
  149. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP