- 论坛徽章:
- 0
|
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- .........
- .........
- .........
- #include <sys/wait.h>
- void sig_waitchild(void)
- {
- pid_t pid;
- /*signal(SIGCHLD,(sighandler_t)sig_waitchild);
- while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
- ;
- }*/
- pid = waitpid(-1,NULL,WNOHANG);
- printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %d\n",pid);
- }
- int init_service(struct sockaddr_in* servaddr)
- {
- int lisfd;
- int opt = 1;
- int len = sizeof(opt);
- lisfd = socket(PF_INET,SOCK_STREAM,0);
- setsockopt(lisfd,SOL_SOCKET,SO_REUSEADDR,(void*)&opt,len);
- if(lisfd < 0)
- return (-1);
- if(bind(lisfd,(struct sockaddr *) servaddr,sizeof(struct sockaddr_in)) < 0)
- return (-1);
- if(listen(lisfd,20) < 0)
- return (-1);
- return (lisfd);
- }
- int main(int argc, char **argv)
- {
- int lisfd, confd, maxfd,close_flag;
- int nready;
- int errno;
- ............
- ............
- pid_t childpid;
- socklen_t clientlen;
- fd_set rset;
- int recv_len = 0,send_len = 0;
- if (alreadyrun() == 1) { /*保证daemon是单实例运行*/
- printf("a daemon already running\n");
- exit(0);
- }
- bzero(&servaddr,sizeof(servaddr));
- bzero(&cliaddr,sizeof(cliaddr));
- servaddr.sin_port = htons(BIND_PORT);
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_family = AF_INET;
- if ((lisfd = init_service(&servaddr)) < 0) {
- perror("init_service");
- exit(-1);
- }
- signal(SIGCHLD,(sighandler_t)sig_waitchild);
- maxfd = lisfd;
- FD_ZERO(&rset);
- FD_SET(lisfd,&rset);
- for (;;) {
- nready = select(maxfd+1,&rset,NULL,NULL,NULL);
- if(nready < 0) {
- if(errno == EINTR)
- continue;
- //perror("select");
- }
- if(FD_ISSET(lisfd,&rset))
- {
- clientlen = sizeof(cliaddr);
- confd = accept(lisfd, (struct sockaddr *)&cliaddr, &clientlen);
- if(confd < 0)
- {
- //perror("accept");
- exit(1);
- }
- if ((childpid = fork()) < 0) {
- perror("fork");
- }
- else if (childpid == 0)
- {
- close(lisfd);
- 数据接收、处理、发送工作;
- .................
- .................
- close(confd);
- }
- }/*end of if(FD_ISSET(lisfd,&rset)) */
- } /* end of for() */
- return 0;
- }
复制代码
[ 本帖最后由 kewenliang 于 2010-1-22 17:24 编辑 ] |
|