• 大小: 1.05MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-10-02
  • 语言: C/C++
  • 标签: C++实现  执行时间  

资源简介

实现思路详见:https://blog.csdn.net/qq_33901011/article/details/100155334 该工程用C语言实现了crontab表达式执行时间,与在线crontab执行时间计算在线工具结果一致,用在嵌入式行业里的设备定时唤醒,定时操作等功能。里面用到了Linux源码中的Crond.c的ParseField函数来解析crontab表达式,基姆拉尔森计算公式计算星期等。

资源截图

代码片段和文件信息

/*
作者:李猿
联系方式:QQ -- 2573507779
测试方法:
*/


#include “stdlib.h“
#include “string.h“
#include “stdio.h“

typedef unsigned         char    uint8_t;
typedef unsigned    short int    uint16_t;
typedef unsigned          int    uint32_t;




#define DEBUG_LINE() printf(“FUN:%s LINE:%d TIME:%s\r\n“ __FUNCTION__ __LINE__ __TIME__)//

//时间 的临时变量,以计算下次唤醒的时间节点 
struct data_time_str
{
//uint8_t sec;
uint8_t min;
uint8_t hour;
uint8_t day;
uint8_t month;
uint16_t year;
uint8_t week;
};


static const char *const DowAry[] = {
“sun“
“mon“
“tue“
“wed“
“thu“
“fri“
“sat“

“Sun“
“Mon“
“Tue“
“Wed“
“Thu“
“Fri“
“Sat“
NULL
};

static const char *const MonAry[] = {
“jan“
“feb“
“mar“
“apr“
“may“
“jun“
“jul“
“aug“
“sep“
“oct“
“nov“
“dec“

“Jan“
“Feb“
“Mar“
“Apr“
“May“
“Jun“
“Jul“
“Aug“
“Sep“
“Oct“
“Nov“
“Dec“
NULL
};

typedef struct CronLine 
{
char cl_Mins[60]; /* 0-59                                 */
char cl_Hrs[24]; /* 0-23                                 */
char cl_Days[32]; /* 0-31                                 */
char cl_Mons[12]; /* 0-11                                 */
char cl_Dow[7]; /* 0-6 beginning sunday                */
} CronLine;



static char *ParseField(char *user char *ary int modvalue int off
const char *const *names char *ptr)
{
char *base = ptr;
int n1 = -1;
int n2 = -1;

if (base == NULL) {
return (NULL);
}

while (*ptr != ‘ ‘ && *ptr != ‘\t‘ && *ptr != ‘\n‘) {
int skip = 0;

/* Handle numeric digit or symbol or ‘*‘ */

if (*ptr == ‘*‘) {
n1 = 0; /* everything will be filled */
n2 = modvalue - 1;
skip = 1;
++ptr;
} else if (*ptr >= ‘0‘ && *ptr <= ‘9‘) {
if (n1 < 0) {
n1 = strtol(ptr &ptr 10) + off;
} else {
n2 = strtol(ptr &ptr 10) + off;
}
skip = 1;
} else if (names) {
int i;

for (i = 0; names[i]; ++i) {
if (strncmp(ptr names[i] strlen(names[i])) == 0) {
break;
}
}
if (names[i]) {
ptr += strlen(names[i]);
if (n1 < 0) {
n1 = i;
} else {
n2 = i;
}
skip = 1;
}
}

/* handle optional range ‘-‘ */

if (skip == 0) {
printf(“  failed user %s parsing %s\n“ user base);
DEBUG_LINE();
return (NULL);
}
if (*ptr == ‘-‘ && n2 < 0) {
++ptr;
continue;
}

/*
 * collapse single-value ranges handle skipmark and fill
 * in the character array appropriately.
 */

if (n2 < 0) {
n2 = n1;
}
if (*ptr == ‘/‘) {
skip = strtol(ptr + 1 &ptr 10);
}
/*
 * fill array using a failsafe is the easiest way to prevent
 * an endless loop
 */

{
int s0 = 1;
int failsafe = 1024;

--n1;
do {
n1 = (n1 + 1) % modvalue;

if (--s0 == 0) {
ary[n1 % modvalue] = 1;
s0 = skip;
}
}
while (n1 != 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-08-30 11:31  寻找唤醒时间节点\
     目录           0  2019-08-30 10:07  寻找唤醒时间节点\Debug\
     文件       32256  2019-08-30 13:13  寻找唤醒时间节点\Debug\寻找唤醒时间节点.exe
     文件      454356  2019-08-30 13:13  寻找唤醒时间节点\Debug\寻找唤醒时间节点.ilk
     文件      437248  2019-08-30 13:13  寻找唤醒时间节点\Debug\寻找唤醒时间节点.pdb
     目录           0  2019-08-30 10:05  寻找唤醒时间节点\ipch\
     目录           0  2019-08-30 10:05  寻找唤醒时间节点\ipch\寻找唤醒时间节点-4b2a15d9\
     文件     2359296  2019-08-30 10:05  寻找唤醒时间节点\ipch\寻找唤醒时间节点-4b2a15d9\寻找唤醒时间节点-a3f58340.ipch
     目录           0  2019-08-30 10:07  寻找唤醒时间节点\寻找唤醒时间节点\
     目录           0  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\
     文件        1338  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\cl.command.1.tlog
     文件        3890  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\CL.read.1.tlog
     文件         612  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\CL.write.1.tlog
     文件           2  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link-cvtres.read.1.tlog
     文件           2  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link-cvtres.write.1.tlog
     文件           2  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.8020-cvtres.read.1.tlog
     文件           2  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.8020-cvtres.write.1.tlog
     文件           2  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.8020.read.1.tlog
     文件           2  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.8020.write.1.tlog
     文件        1544  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.command.1.tlog
     文件        3048  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.read.1.tlog
     文件         826  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\link.write.1.tlog
     文件       23768  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\main.obj
     文件         406  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\mt.command.1.tlog
     文件         346  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\mt.read.1.tlog
     文件         346  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\mt.write.1.tlog
     文件         566  2019-08-30 10:07  寻找唤醒时间节点\寻找唤醒时间节点\Debug\rc.command.1.tlog
     文件         318  2019-08-30 10:07  寻找唤醒时间节点\寻找唤醒时间节点\Debug\rc.read.1.tlog
     文件         326  2019-08-30 10:07  寻找唤醒时间节点\寻找唤醒时间节点\Debug\rc.write.1.tlog
     文件       52224  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\vc100.idb
     文件       69632  2019-08-30 13:13  寻找唤醒时间节点\寻找唤醒时间节点\Debug\vc100.pdb
............此处省略15个文件信息

评论

共有 条评论