Exemple #1
0
// 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();
}
Exemple #2
0
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");
}