// init server void initServer(void) { int j; // ignore sighup, sigpipe signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); // 设置信号处理函数 setupSignalHandlers(); if (server.syslog_enabled) { openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT, server.syslog_facility); } // 当前客户端相关状态 server.current_client = NULL; // 创建一个链表, 用于存储客户端 server.clients = listCreate(); // 创建客户端关闭链表 server.clients_to_close = listCreate(); // 从redis链表 server.slaves = listCreate(); // 监控链表 server.monitors = listCreate(); server.slaveseldb = -1; // 未锁定客户端链表 server.unblocked_clients = listCreate(); // 准备key链表 server.ready_keys = listCreate(); // 创建共享对象 createSharedObjects(); // 打开文件描述符限制 adjustOpenFilesLimit(); }
int main(int argc, char* argv[]) { signal(SIGPIPE,SIG_IGN); signal_exit_handler(); int background = 0; if(background) { daemonize(); } assert(argc == 5); int maxclients = atoi(argv[3]) + CONFIG_FDSET_INCR; adjustOpenFilesLimit(maxclients); int epoll_fd = epoll_create(1024); start_conn(epoll_fd,atoi(argv[3]), argv[1],atoi(argv[2]),atoi(argv[4])); epoll_event *events = (epoll_event*)malloc(sizeof(struct epoll_event) * (maxclients) ); char buffer[2048]; while(!stop) { int fds = epoll_wait(epoll_fd,events,maxclients,2000); for(int i = 0; i < fds; i++) { int sockfd = events[i].data.fd; if(events[i].events & EPOLLIN) { if(!read_once(sockfd, buffer,2048)) { close_conn(epoll_fd,sockfd); } struct epoll_event event; event.events = EPOLLOUT | EPOLLET | EPOLLERR; event.data.fd = sockfd; epoll_ctl(epoll_fd,EPOLL_CTL_MOD,sockfd,&event); } else if(events[i].events & EPOLLOUT) { if(!write_nbytes(sockfd,request ,strlen(request))) { close_conn(epoll_fd,sockfd); } struct epoll_event event; event.events = EPOLLIN | EPOLLERR; event.data.fd = sockfd; epoll_ctl(epoll_fd,EPOLL_CTL_MOD,sockfd,&event); } else if(events[i].events & EPOLLERR) { close_conn(epoll_fd,sockfd); } } } close(epoll_fd); if(events) { free(events); } printf("exit!\n"); }