有没有人知道有助于解码cron风格时序的库,即
30 7 * * 1-5
每周一,周二,周三,周四,周五上午7:30。
微米。
答案 0 :(得分:4)
有一个用于PHP的库,Perl但我从未见过一个用于C ++的库。 好消息是Cron的源代码是免费提供的,您可以重用其代码来解析cron格式的条目。
条目数据结构在“cron.h”文件中定义:
typedef struct _entry {
struct _entry *next;
uid_t uid;
gid_t gid;
char **envp;
char *cmd;
bitstr_t bit_decl(minute, MINUTE_COUNT);
bitstr_t bit_decl(hour, HOUR_COUNT);
bitstr_t bit_decl(dom, DOM_COUNT);
bitstr_t bit_decl(month, MONTH_COUNT);
bitstr_t bit_decl(dow, DOW_COUNT);
int flags;
#define DOM_STAR 0x01
#define DOW_STAR 0x02
#define WHEN_REBOOT 0x04
#define MIN_STAR 0x08
#define HR_STAR 0x10
} entry;
“entry.c”文件需要两个函数(太大而不能在此处发布代码):
void free_entry (e);
entry *load_entry (file, error_func, pw, envp);
您可以将这些文件编译成共享库或目标文件,并直接在项目中使用。
这是在Debian(Ubuntu)中获取cron源代码的一个例子:
apt-get source cron
下载
答案 1 :(得分:3)
对于那些希望实现与@ScaryAardvark相同目标的人
<强>相关性:强>
http://cron.sourcearchive.com/downloads/3.0pl1/cron_3.0pl1.orig.tar.gz
<强>构建强>
gcc -o main main.cron-3.0pl1.orig / entry.c cron-3.0pl1.orig / env.c cron-3.0pl1.orig / misc.c -I cron-3.0pl1.orig
<强>来源:强>
#include <pwd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <uuid/uuid.h>
#define MAIN_PROGRAM 1
#include "cron-3.0pl1.orig/cron.h"
void error_handler( char* message )
{
fprintf( stderr, "Error: %s\n", message );
}
void print_entry( const entry* e )
{
fprintf( stdout, "uid: %i\n", e->uid );
fprintf( stdout, "gid: %i\n", e->gid );
fprintf( stdout, "command: %s\n", e->cmd);
//etc...
}
int main( int argc, char** argv, char** envp )
{
const char* filename = "crontab";
const char* username = "bcrowhurst";
//Retreive Crontab File
FILE *file = fopen( filename, "r" );
if ( file == NULL )
{
error_handler( strerror( errno ) );
return EXIT_FAILURE;
}
//Retreive Password Entry
struct passwd *pw = getpwnam( username );
if ( pw == NULL )
{
error_handler( strerror( errno ) );
return EXIT_FAILURE;
}
//Read Entry
entry *e = load_entry( file, &error_handler, pw, envp );
if ( e == NULL )
{
error_handler( "No entry found!" );
return EXIT_FAILURE;
}
print_entry( e );
//Clean-up
fclose( file );
free_entry( e );
return EXIT_SUCCESS;
}
示例Crontab
@yearly / home / bcrowhurst / annual-process
* / 10 * * * * / home / bcrowhurst / fschk