crontab格式的CPP解析代码段

来源:互联网 发布:华尔街工资知乎 编辑:程序博客网 时间:2024/05/20 23:02

http://download.csdn.net/detail/james2102/9619059

项目需要实现一个按crontab格式调度任务的C++模块。但是查了下网上的资源,crontab格式解析有Java,python和php的库,就是没有C++的版本。不过crontab的c代码是开源的,直接下载下来读了一遍,发现可以很容易的修改一下就可以使用了,所以修改了一版经测试可以使用,所以传到了网上,在这里对代码逻辑做一些解释和说明。

下载的是crontab的c开源代码,由于项目是C++的,所以修改后的代码使用了C++的库,如string,sstream, iostream。
链接里的压缩包下载后可以直接使用。

cron.h

bool is_cron_format(const std::string& cron, std::string* errmsg);

该函数尝试解析一个crontab格式的字符串,成功则返回true,失败返回false。
输入:std::string& cron: crontab格式的的字符串。如 30 * * * *表示没小时的第30分钟。
输出:std::string* errmsg: 返回的错误信息。
返回值: true/false

bool reach_cron(const std::string& cron, std::string* errmsg); 

判断当前时刻是否匹配cron传入的crontab格式。

cron.cpp中对crontab开源源代码的修改部分

cron.cpp entry.c struct CronEntry struct _entry load_cron_entry从std::string中读入一条cron记录,且格式为 * * * * ,只负责解析定时部分,没有cmd,因而load_cron_entry解析完定时部分后就结束了。为了模拟entry.c中各个解析函数(输入参数为FILE*)*, load_cron_entry采用了std::stringstream 来处理crontab定时格式的解析,并给stringstream最后添加了换行符来界定解析的完成 load_entry从crontab文件中读取每条输入记录,每条记录的格式为linux的crontab格式 * * * * * cmd,同时有有定时和cmd这两部分

reach_cron

bool reach_cron(const std::string& cron, std::string* errmsg)

修改自cron.c的cron_tick()接口

bitstring.h

伯克利开源的bitstring库,类似于位图(bitmap),crontab定时格式中的分钟、小时、星期、天、月份中的某个字段设置了值得话,其在bitmap中对应的字段就会被设置为1 (bit_set)
reach_cron()函数调用gettimeofday,获取当前时刻的月份(month)、天数(dom,day of month), 星期(dow,day of week), 小时(hour),分钟(minute),然后调用bit_test()接口,判断当前的分钟是不是crontab定时格式设定的分钟(仅以分钟举例,其他字段类似),就可以判断当前时刻是否和crontab的定时时刻匹配。

0 0
原创粉丝点击