于是分析pdnsd的源代码,首先从处理缓存的cache.c源代码入手,找到read_disk_cache()函数,发现如下代码:
if(memcmp(buf,cachverid,sizeof(cachverid))) {结合日志中出现了这样一条错误信息,初步认为是pdnsd.cache文件开头少了“pd13”,加上后,查看除错日志,没有报错,但仍旧无法保存。
log_warn("Cache file %s ignored because of incompatible version identifier",path);
goto free_data_fclose;
}
继续研究代码,发现write_disk_cache()函数,这个函数实现了把缓存写入硬盘的功能。回到main.c,来到这行代码:
if(sig) DEBUG_MSG("Signal %i caught.\n",sig);
write_disk_cache();
这个函数被执行的条件是sig不等于0。突然想起平时结束进程用的都是 kill -9(强制终止),怀疑是进程没有接收到信号就被终止了。于是将9改成15,果然缓存能够保存到硬盘上了。