⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cron.c

📁 这是一个我自己仿照linux下cron程序写的精简版的cron
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <sys/time.h>#include <time.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>#include <stdio.h>#include <syslog.h>#include <errno.h>#include <sys/file.h>#include <pwd.h>#include <string.h>#include <sys/ipc.h>#include <sys/sem.h>#include <unistd.h>#include <signal.h>#include <sys/wait.h>#include "cron.h"static char ProgramName[]="my_cron";//static int minute_rec[MINUTE_RANGE];//static int hour_rec[HOUR_RANGE];//static int day_of_mon_rec[DAY_OF_MOU_RANGE];//static int mon_of_year_rec[MONTH_OF_YEAR_RANGE];//static int day_of_week_rec[MONTH_OF_YEAR_RANGE];int timerunning;date_rec *head = NULL;int daemon_init(){        pid_t pid;        if( (pid = fork()) < 0)                return -1;        else if(pid != 0) /* parent exit */                exit(0);        setsid();        chdir("/");        umask(0);        /* close stdin, stdout and stderr*/        freopen("/dev/null", "r", stdin);        freopen("/dev/null", "w", stdout);        freopen("/dev/null", "w", stderr);        return 0;}void log_err(char *error){        openlog(ProgramName,LOG_PID,LOG_USER);        syslog(LOG_ERR, error);}static int get_next_token(char *buffer,char *line,int *pt){        int i = 0;        while (line[*pt] == ' ' || line[*pt] == '\t') {                (*pt)++;        }        if (line[*pt] == ',') {                (*pt)++;                return 4;        } else if (isdigit(line[*pt])) {                buffer[i++] = line[*pt];                (*pt)++;                while (isdigit(line[*pt])) {                        buffer[i++] = line[*pt];                        (*pt)++;                }                if (line[*pt] == ',') {                        buffer[i] = '\0';                        (*pt)++;                        return 3;                } else if (line[*pt] == ' ' || line[*pt] == '\t') {                        buffer[i] = '\0';                        while(line[*pt] == ' ' || line[*pt] == '\t')                                (*pt)++;                        if(line[*pt] == ',') {                                (*pt)++;                                return 3;                        } else                                return 1;                } else {                        return 5;                }        } else if (line[*pt] == '*') {                (*pt)++;                return 2;        } else {                return 5;        }}static int add_rec(){        char n[MAX_LINE];        date_rec * temp;        snprintf(n,MAX_LINE,"%s: malloc fail to add new record!",ProgramName);        if((temp = (date_rec *)malloc(sizeof(date_rec))) == NULL) {                log_err(n);                return(0);        }        memset(temp,0,sizeof(date_rec));        temp->next = NULL;        temp->next = head;        head = temp;        return 1;}static void del_rec(){        date_rec * p;        if(head == NULL)                return;        else {                p = head;                while(head) {                        p = head->next;                        free(head);                        head = p;                }        }        head = NULL;}static int check_number(char *buffer,int i){        int num;        int value[5][2] = {{0,59},{0,23},{1,31},{1,12},{0,6}};        num = atoi(buffer);        if(num >= value[i][0] && num <= value[i][1])                return num;        else                return -1;}static void record_it(date_rec * d,int i,int num){        int flag = 1;        if(num == '*')                flag = 0;        switch(i) {                case 0:                        if(flag)                                //d->minute_rec[num] = 1;                                MARK(d->minute_rec,num);                        else                                //memset(d->minute_rec,1,sizeof(d->minute_rec));                                SET(d->minute_rec);                        break;                case 1:                        if(flag)                                //d->hour_rec[num] = 1;                                MARK(d->hour_rec,num);                        else                                //memset(d->hour_rec,1,sizeof(d->hour_rec));                                SET(d->hour_rec);                        break;                case 2:                        if(flag)                                //d->day_of_mon_rec[num] = 1;                                MARK(d->day_of_mon_rec,num);                        else                                //memset(d->day_of_mon_rec,1,sizeof(d->day_of_mon_rec));                                SET(d->day_of_mon_rec);                        break;                case 3:                        if(flag)                                //d->mon_of_year_rec[num] = 1;                                MARK(d->mon_of_year_rec,num);                        else                                //memset(d->mon_of_year_rec,1,sizeof(d->mon_of_year_rec));                                SET(d->mon_of_year_rec);                        break;                case 4:                        if(flag)                                //d->day_of_week_rec[num] = 1;                                MARK(d->day_of_week_rec,num);                        else                                //memset(d->day_of_week_rec,1,sizeof(d->day_of_week_rec));                                SET(d->day_of_week_rec);                        break;                default:                        break;        }}int load_rec(){        date_rec * current_date;        char n[MAX_FNAME];        char error[MAX_LINE];        char *User;        FILE *crontab;        struct passwd *pw;        /*----------------------------------------------*/        char line[MAX_LINE];        char buffer[MAX_FNAME];        char * f;        int pt = 0;        int i = 0;        int flag = 0;        int can_gets = 0;        int finish = 0;        int num = 0;        int temp;        /* open the crontab */        if (!(pw = getpwuid(getuid()))) {                snprintf(error,MAX_LINE,"%s: your UID isn't in the passwd file.\n",                         ProgramName);                log_err(error);                return(0);        }        /* dup the user id*/        if (((User=strdup(pw->pw_name)) == NULL)) {                snprintf(error,MAX_LINE, "%s: Memory allocation error\n",ProgramName);                log_err(error);                return(0);        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -