剛下班,吃了點飯,精神飽滿,讓咱們繼續分析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函數。
累了,休息一會。
今天被公司副總任命爲項目經理,繼續加油,我的以爲問題不大,技術的東西能有多難。