2017年10月30日星期一

解决自编译pdnsd在Padavan下无法将缓存保存到硬盘上的问题

最近为了IPV6 DNS的需求自己编译了一份pdnsd,thread-lib选择的是NPTL。发现在Padavan下出现了无法保存缓存到硬盘上的问题,结合帮助文档以为是NPTL的问题,遂换成LinuxThread重新编译,结果照旧。
于是分析pdnsd的源代码,首先从处理缓存的cache.c源代码入手,找到read_disk_cache()函数,发现如下代码:
  if(memcmp(buf,cachverid,sizeof(cachverid))) {
   log_warn("Cache file %s ignored because of incompatible version identifier",path);
   goto free_data_fclose;
  }
结合日志中出现了这样一条错误信息,初步认为是pdnsd.cache文件开头少了“pd13”,加上后,查看除错日志,没有报错,但仍旧无法保存。
继续研究代码,发现write_disk_cache()函数,这个函数实现了把缓存写入硬盘的功能。回到main.c,来到这行代码:

 if(sig) DEBUG_MSG("Signal %i caught.\n",sig);
 write_disk_cache();

这个函数被执行的条件是sig不等于0。突然想起平时结束进程用的都是 kill -9(强制终止),怀疑是进程没有接收到信号就被终止了。于是将9改成15,果然缓存能够保存到硬盘上了。