- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Bind-9.6.0-P1源代码分析之一:整体架构(初稿)
一、说明
参考/lxr/http/source/bin/named/main.c
这是bind解析程序的入口
事件bind程序也事件驱动型,以任务作为主要的执行。
当一个解析请求到来时,就会通过事件的产生来触发任务dispatch处理。这样的处理有相应
if(event-ev_action!=NULL){861
UNLOCK(task-lock);862
(event-ev_action)(task,event);
863
LOCK(task-lock);
这里action就是执行函数
本文主要关注整体的运行结构,主要参考文件是main.c
二、启动入口
870int
871main(intargc,char*argv[]){命令行参数传入以上为设置错误消息
isc_assertion_setcallback(assertion_failed);
isc_error_setfatal(library_fatal_error);
isc_error_setunexpected(library_unexpected_error);
初始化系统日志,权限等
ns_os_init(program_name);
初始化工作
dns_result_register();
dst_result_register();
isccc_result_register();
命令行参数分析,如-g将日志输出到front-end905 parse_command_line(argc,argv);
{注意以下的内存机制,isc_mem可见/lxr/http/source/lib/isc/mem.c#L113定义注意以/lxr/http/source/lib/isc/mem.c#L725
用到了锁机制
830 LOCK(lock);
831 ISC_LIST_INITANDAPPEND(contexts,ctx,link);832 UNLOCK(lock);
833
内存生成采用标准的系统调用malloc和free,但考虑到多线程下的竞争情况,对内存块访问需要锁机制。Ns_g_mctx是信号量,要求ns_g_mctx!=NULL*ns_g_mctx=NULL
}
result=isc_mem_create(0,0,ns_g_mctx);
if(result!=ISC_R_SUCCESS)
ns_main_earlyfatal(isc_mem_create()failed:%s,
isc_result_totext(result));
对设置
isc_mem_setname(ns_g_mctx,main,NULL);924//setup是重要的一部分,见分析三
925 setup();
接下来就是解析主体程序了,是通过循环来做的,直到错误或者接收到退出信号。递
/*
928
*Startthingsrunningandthenwaitforashutdownrequest
929
*orreload.
930
*/
931
do{
932
result=isc_app_run();是重要部分,见分析四
933
934
if(result==ISC_R_RELOAD){//通过我们会做这种操
作,当配置了一个新的zone文件时
935 ns_server_reloadwanted(ns_g_server);936 }elseif(result!=ISC_R_SUCCESS){
937 UNEXPECTED_ERROR( FILE , LINE ,
938 isc_app_run():%s,
939
isc_result_totext(result));940 /*
941 *Forceexit.
942 */
943 result=ISC_R_SUCCESS;
944 }
945 }while(result!=ISC_R_SUCCESS);946
948if(ns_smf_want_disable==1){949result=
948
if
(ns_smf_want_disable==1){
949
result=ns_smf_get_instance(instance,1,
ns_g_mctx);950
if(result==ISC_R_SUCCESSinstance!=NULL)
{
951 if(smf_disable_instance(instance
您可能关注的文档
- ALC板在工程中的应用.docx
- ALE方法详解及各选项卡参数意义与设置.docx
- ALT键在PHOTOSHOP中的应用.docx
- American Romantic Period分析和总结分析和总结.docx
- Android 课后习题分析和总结.docx
- ANNE 19 Reference and Retention Samples WZH 20060906分析和总结分析和总结.docx
- ANSI 21222000分析和总结分析和总结.docx
- ANSYS基础培训练习.docx
- ansys声学分析分析和总结.docx
- AnyArray类该类对象是整形双精度形浮点形布尔形字符等各种类型访问时如果数组下标越界.docx
文档评论(0)