📄 gendaemon.c
字号:
#include "shmmsg.h"/**#define USIZE 32768 */struct comshm *shmp,*GetShm();int msgrcvid,msgsndid;int rcvsock[MAX_BIND];int num;int errno;main(){int childpid;int semid;int unixrcvbuf,unixsndbuf,bint;void EXIT();int GenDaemon();BINDNO bindno;int newrcvsock[MAX_BIND];int maxsock;int nfds;int alen;fd_set rfds,masterset;struct sockaddr_in fsin; if (GenDaemon()<0) { syslog("Run GenDaemon failed !!",__FILE__,__LINE__); printf("\nRun GenDaemon failed !!\n"); exit(1); } signal(SIGCLD,SIG_IGN); signal(SIGCHLD,SIG_IGN); signal(SIGTERM,EXIT ); /*memset(bindno,0,sizeof(BINDNO));*/ memset(rcvsock,0,sizeof(int)*MAX_BIND); memset(newrcvsock,0,sizeof(int)*MAX_BIND); /*memset(fsin,0,sizeof(struct sockaddr_in)); memset(rfds,0,sizeof(fd_set));*/ if (getrcvport(&bindno) < 0) syslog("getrcvport err!",__FILE__,__LINE__); shmp=GetShm(); if (shmp==NULL) { syslog("Get share memory err!",__FILE__,__LINE__); exit(-1); } semid=opensem(SEMKEY1); if(semid <0) { syslog("get semaphore error!",__FILE__,__LINE__); perror("get sema error"); exit(-3); } num=0; while ((bindno.bind[num].rcvport != 0)&&(num < MAX_BIND)) { rcvsock[num]=passivesock(bindno.bind[num].rcvport); if (rcvsock[num] < 0) { syslog("bind err!",__FILE__,__LINE__); exit(-1); } num++; } num=0; maxsock=rcvsock[num]; while ((rcvsock[num] != 0)&&(num < MAX_BIND)) { if (maxsock < rcvsock[num]) maxsock=rcvsock[num]; num++; } nfds=maxsock+1; FD_ZERO(&rfds); num=0; while ((rcvsock[num] != 0)&&(num < MAX_BIND)) { FD_SET(rcvsock[num],&masterset); num++; } while(1) { rfds = masterset; if (select(nfds,&rfds,(fd_set *)0,(fd_set *)0, (struct timeval *)0) < 0) syslog("select error:",__FILE__,__LINE__); num=0; while ((rcvsock[num] != 0)&&(num < MAX_BIND)) { if (FD_ISSET(rcvsock[num],&rfds)) { alen=sizeof(fsin); newrcvsock[num] = accept(rcvsock[num],(struct sockaddr *)&fsin, &alen); if (newrcvsock[num] < 0) { syslog("not accept!",__FILE__,__LINE__); continue; } /*errno = 0;*/ sem_open(semid); while ((childpid=fork()) < 0) { if (errno==EINTR||errno==EAGAIN){ errno=0; sleep(1); continue; } else { perror("fork err "); errno=0; num=0; while ((rcvsock[num] != 0)&&(num < MAX_BIND)) { close(rcvsock[num]); close(newrcvsock[num]); num++; } syslog("forksonerr",__FILE__,__LINE__); sem_close(semid); exit(-6); } } if (childpid == 0) { close(rcvsock[num]); conrcvdeal( newrcvsock[num] ); v_debug("newconrcvdeal [%d]\n",newrcvsock[num]); sem_close(semid); exit(0); } close(newrcvsock[num]); } num++; } }} voidEXIT(){ syslog("GenDaemon is killed !",NULL,0); num=0; while ((rcvsock[num] != 0)&&(num < MAX_BIND)) { close(rcvsock[num]); num++; } exit(0);}int getrcvport(BINDNO *bindnop){int count,i;int j=0; shmp = GetShm(); if (shmp==NULL){ syslog("Get share memory err!",__FILE__,__LINE__); return(-1); } count=shmp->addno; for(i=0;i<count;i++) { if (shmp->addstrlist[i].flag != 0) { bindnop->bind[j].jgbm=0; bindnop->bind[j].rcvport=shmp->addstrlist[i].rcvport; j++; } } DtcShm(shmp); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -