接下来看radar部分,也就是探测主程序cloudforecast_radar,其中主要就是调用CloudForecast::Radar中的run()函数。 首先还是惯例,调用ConfigLoader模块加载配置文件; 然后是%SIG信号的定义,用来之后自动重运行的; 然后一个while true死循环: 1、循环里用select(undef,undef,undef,0.5)实现一个0.5秒的sleep; 2、第一个if语句,用来判断是否是父进程,并使用无阻塞的waitpid($pid,WNOHANG)等待子进程完成——即$kid==-1; 3、第二个if语句,用来强制退出死循环,条件是收到%SIG信号; 4、第三个if语句,确认当前时间超过计划中的执行时间(即离上次执行时间最近的整5分钟点),开始执行探测——采用fork()派生子进程。 5、子进程内容是从之前获取的配置文件内,轮询每一台设备,最终调用run_host()函数执行。 然后又是两个if语句,接在while里的last之后,等待子进程全部完成的。

接下来看run_host()函数,其实就是new了一个CloudForecast::Host对象,并调用其run()函数。 这个run()函数,就是根据config里的resource调用相应的CloudForecast::Data::*,最后到CloudForecast::Data里的call_fetch()函数。ok,这个函数上一篇已经看过了。