刚下班,吃了点饭,精神饱满,让咱们继续分析initServer,这个函数仍是很重要的。 redis
~~~~~~~~~~~~~~~~~~ api
int j; ide
signal(SIGHUP, SIG_IGN);//注册信号处理程序为忽略
signal(SIGPIPE, SIG_IGN);//注册信号处理程序为忽略 函数
下面是setupSignalHandlers();函数,看这个函数的代码,得知目的是: oop
为信号SIGTERM注册处理程序sigtermHandler spa
为信号SIGSEGV,SIGBUS,SIGFPE,SIGILL统一注册信号处理程序:sigsegvHandler server
///////////////////////////////////////////////////////////////////////////////
if (server.syslog_enabled)
{
openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
server.syslog_facility);
}
//默认不执行
对象
server.current_client = NULL;//设置current_client--->NULL
server.clients = listCreate();
//初始化clients
server.clients_to_close = listCreate();
server.slaves = listCreate();
server.monitors = listCreate();
server.slaveseldb = -1; /* Force to emit the first SELECT command. */
server.unblocked_clients = listCreate();
server.ready_keys = listCreate(); ip
上面这些代码都很简单,简单的初始化而已。 ci
~~~~~~~~~~
下面来分析createSharedObjects函数
能够看到用到了函数createObject,只不过参数不同而已,
那咱们就看看createObject产生的对象的模板是什么样的!
通过分析,模板以下:
typedef struct redisObject
{
unsigned type:4;
//type,由参数决定
unsigned notused:2; /* Not used */
unsigned encoding:4;
///REDIS_ENCODING_RAW
unsigned lru:22; /* lru time (relative to server.lruclock) */
// server.lruclock,此时为 0
int refcount;
// 1
void *ptr;
//由参数决定
} robj;
那么就能够相应的改变type和ptr就能够了。
那么剩下的就好说了,这里不赘述。
adjustOpenFilesLimit();
//调整最大文件打开的数目
~~~~~~~~~~~~~~~~~~~~~
下面是aeCreateEventLoop(server.maxclients+REDIS_EVENTLOOP_FDSET_INCR);
让咱们看下这个函数的执行结果
typedef struct aeEventLoop
{
int maxfd; /* highest file descriptor currently registered */
// -1
int setsize; /* max number of file descriptors tracked */
// ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR )
long long timeEventNextId;
// 0
time_t lastTime; /* Used to detect system clock skew */
//2013-10-17 22:56,我看时的时间是这个
aeFileEvent *events; /* Registered events */
//( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR ) * sizeof(aeFileEvent)
//且每一个event.mask = AE_NONE
aeFiredEvent *fired; /* Fired events */
// ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR ) * sizeof(aeFiredEvent)
aeTimeEvent *timeEventHead;
// NULL
int stop;
// 0
void *apidata; /* This is used for polling API specific data */
/*
typedef struct aeApiState {
int epfd;
// epoll_create(1024);
struct epoll_event *events;
// ( server.maxclients+REDIS_EVENTLOOP_FDSET_INCR ) * sizeof(epoll_event)
} aeApiState;
*/
aeBeforeSleepProc *beforesleep;
// null
} aeEventLoop;
其中epfd很重要,使用epoll_create API来建立,这个相信你们都不陌生。
备注:我喜欢用epoll,因此这里我看的是epoll函数。
累了,休息一会。
今天被公司副总任命为项目经理,继续加油,我的以为问题不大,技术的东西能有多难。