这是后边 运行 的部分。
【 在 ylh1969 的大作中提到: 】
: 以下是对应构造函数的部分,大差不差。
: /***************************************************************
: * 线程池模型的入口函数,主线程主要负责资源管理
: ...................
int repeat=0;
leng=sizeof(cin);
while(1) {
do {
FD_ZERO(&efds);
FD_SET(sock, &efds);
//健康检查周期
tm.tv_sec=15;//可以改
tm.tv_usec=0;
ret=select(sock+1,&efds,NULL,&efds,&tm);
if(ret==-1) {
ShowLog(1,"select error %s",strerror(errno));
close(sock);
quit(3);
}
if(ret==0) {
check_TCB_timeout();//体检
if(poolchk) poolchk();
}
} while(ret<=0);
i=get_task_no();//取task号,不得不休,死磕。
task=&client_q.pool[i];
s=accept(sock,(struct sockaddr *)&cin,&leng);
if(s<0) {
ShowLog(1,"%s:accept err=%d,%s",__FUNCTION__,errno,strerror(errno));
client_del(task);
switch(errno) {
case EMFILE://fd用完了,其他线程还要继续工作,主线程休息一下。
case ENFILE:
usleep(30000000);
continue;
default:break;
}
usleep(15000000);
if(++repeat < 20) continue;
ShowLog(1,"%s:network fail! err=%s",__FUNCTION__,strerror(errno));
close(sock);
quit(5);
}
repeat=0;
task->fd=task->conn.Socket=s;
task->timestamp=now_usec();
task->timeout=60;
task->status=-1;
task->conn.only_do=(int (*)())conn_init;
ret=do_epoll(task,EPOLL_CTL_ADD,0);//任务交给其他线程做
}
close(sock);
}
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*