- 论坛徽章:
- 0
|
如何调试一个daemon进程?
帮楼主贴出全部代码?斑竹看一下。我们也学习一下。
- #include <sys/types.h>;
- #include <sys/stat.h>;
- #include <sys/socket.h>;
- #include <netinet/in.h>;
- #include <signal.h>;
- #include <fcntl.h>;
- #include <stdio.h>;
- #include <time.h>;
- #include <syslog.h>;
- #include <errno.h>;
- #include <stdarg.h>;
- #define BUFFSIZE 4096
- #define TCP_SIZE 1460
- int listenfd,clifd,maxfd;
- char recvbuf[BUFFSIZE],key[BUFFSIZE],sendbuf[BUFFSIZE];
- int daemon_init(void);
- int sig_do(int);
- void sendinfo(int, char *);
- void log_open(const char *, int, int);
- void log_sys(const char *, ...);
- void log_msg(const char *, ...);
- static void log_doit(int, int, const char *, va_list ap);
- int
- main(void)
- {
- struct sockaddr_in servaddr;
- log_open("open.server",LOG_PID,LOG_USER);
- daemon_init();
- if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0)
- log_sys("socket error");
- bzero(&servaddr,sizeof(servaddr));
- servaddr.sin_family=AF_INET;
- servaddr.sin_port=htons(80);
- servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
- if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
- log_sys("bind error");
- if(listen(listenfd,5)<0)
- log_sys("listen error");
- signal(SIGIO,sig_do);
- fcntl(listenfd,F_SETOWN,getpid());
- fcntl(listenfd,F_SETFL,O_ASYNC);
- for(;;);
- exit(0);
- }
- int
- sig_do(int signo)
- {
- struct sockaddr_in cliaddr;
- socklen_t addrlen;
- char *p;
- int recvlen;
- while(1){
- addrlen=sizeof(cliaddr);
- if((clifd=accept(listenfd,(struct sockaddr *)&cliaddr,&addrlen))<0)
- log_sys("accept error");
- while(1){
- if((recvlen=recv(clifd,recvbuf,sizeof(recvbuf),0))<0)
- log_sys("recv error");
- else if(recvlen==0)
- break;
- recvbuf[recvlen]=0;
- log_msg(recvbuf);
- if(strncmp(recvbuf,"GET",3)==0){ /* 判断请求类型是否为GET */
- p=strchr(recvbuf+3,'/'); /* 在请求中"/"的匹配之处 */
- if(p==0) break;
- p++;
- //if(*p==' ')
- {
- sendinfo(clifd,"./index.htm");
- break;
- }
- }else
- log_sys("bad request");
- }
- close(clifd);
- }
- return;
- }
- void sendinfo(int sock,char *filename)
- {
- char *sendDate,sendbuf[16384]="HTTP/1.0 200 OK\nServer: FreeBSD 4.7\n";
- int len,pos,fd;
- time_t tp;
- tp=time(NULL);
- sendDate=ctime(&tp);
- strcat(sendbuf,sendDate);
- strcat(sendbuf,"Content-Type: text/html\nConnection: close\n\n\n\n");
- pos=0;
- len=strlen(sendbuf);
- if((fd=open(filename,O_RDONLY))<0)
- log_sys("open error");
- len+=read(fd,sendbuf+len,sizeof(sendbuf)-len-1);
- while(len>;0) /* 每次1460数据发给客户,直到sendbuf空 */
- {
- send(sock,sendbuf+pos*TCP_SIZE,TCP_SIZE,0);
- len-=TCP_SIZE;
- pos++;
- }
- close(fd);
- }
- 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);
- }
- void
- log_open(const char *ident, int option, int facility)
- {
- openlog(ident,option,facility);
- }
- void
- log_msg(const char *fmt, ...)
- {
- va_list ap;
- va_start(ap, fmt);
- log_doit(0, LOG_ERR, fmt, ap);
- va_end(ap);
- return;
- }
- void
- log_sys(const char *fmt, ...)
- {
- va_list ap;
- va_start(ap,fmt);
- log_doit(1,LOG_ERR,fmt,ap);
- va_end(ap);
- exit(2);
- }
- static void
- log_doit(int errnoflag, int priority, const char *fmt, va_list ap)
- {
- int errno_save;
- char buf[BUFFSIZE];
- errno_save=errno;
- vsprintf(buf,fmt,ap);
- if(errnoflag)
- sprintf(buf+strlen(buf),":%s",strerror(errno_save));
- strcat(buf,"\n");
- syslog(priority,buf);
- return;
- }
复制代码 |
|