在myapp.c程序中,read_config()就是读取保存在SMF全局资源库配置的过程。除了在main()过程第43行服务启动时被调用外,还在sig_usr()过程中第206行被调用。而sig_usr()过程在app_init()初始化过程中被设定为SIGUSR1信号的处理程序。这意味着,此服务在运行过程中只要收到SIGUSR1信号后,就会重新读取存在SMF资源库中的配置信息。
使用libscf.so的API读取SMF全局资源库/etc/svc/repository.db服务配置属性的一般流程如下图所示。
本例中,服务名字为application/myapp。属性组myapp内只有一个属性log_filename,它指定了日志文件的全路径文件名。由于此属性为字符型,所以使用scf_value_get_astring()将属性值value转换字符串置于filename。如果服务有更多的属性,可以多次执行循环1,甚至如果用户服务有多个属性组,可以多次执行循环2,直至将所有属性全部读出。
read_config()过程的第114至118行逻辑是申请scf资源,其目的是先得到保存相关scf资源的内存。相应的destroy_scf()过程是释放scf资源。当配置读取完毕后,应将所有申请的scf资源释放。
本例只使用很少一部分libscf.so中的API调用,API调用列表可参考man libscf(3LIB)。API调用具体定义可以参考man pages section 3: Extended Library Functions。有关SMF服务、属性组、属性等概念,以及SMF服务开发方面更多信息,请参阅Solaris Service Management Facility - Service Developer Introduction。
利用Sun公司最新推出的C/C++/Fortran开发及编译环境Sun Studio 11,使用以下命令可将本例将myapp.c编译成可执行程序myapp。
标签: