file:schedule.h
file:schedule.c
file:schedule_demo.c
#ifndef _SCHEDULE_H_
#define _SCHEDULE_H_
#include <errno.h>
#include <signal.h>
#include <string.h> // for strerror
#include <sys/time.h> // for setitimer
#define MAX_TASK (128)
#define MAX_TASK_NAME (128)
// typedef __sighandler_t sighandler_t;
typedef void (*sighandler_t)(); // void func();
typedef struct
{
long used;
void (*taskhandle)();
char taskname[MAX_TASK_NAME];
long delay;
long period;
long value;
} task_t;
typedef struct
{
int initialized;
task_t tasks[MAX_TASK];
} schedule_t;
void timer_handle(int signo); // SIGALRM信号处理函数
int add_timer(void (*task)(), const char *taskname, long delay /*ms*/, long period /*ms*/); // 添加定时任务
int del_timer(void (*task)()); // 删除定时任务
int show_timer(); // 当前定时任务状态
#define AddTimer(task, delay, period) add_timer(task, #task, delay, period)
#define DelTimer(task) del_timer(task)
#define ShowTimer() show_timer()
#endif // _SCHEDULE_H_
#include "schedule.h"
#include <stdio.h>
schedule_t schedule;
void timer_handle(int signo)
{
void (*handle)();
if (SIGALRM != signo)
{
return;
}
if (!schedule.initialized)
{
return;
}
for (int i = 0; i < MAX_TASK; i++)
{
if (schedule.tasks[i].used)
{
schedule.tasks[i].value--;
if (schedule.tasks[i].value < 1)
{
schedule.tasks[i].value = schedule.tasks[i].period;
handle = schedule.tasks[i].taskhandle;
handle();
}
}
}
}
int add_timer(void (*task)(), const char *taskname, long delay /*ms*/, long period /*ms*/)
{
struct itimerval timervar = {
.it_value = {.tv_sec = 0, .tv_usec = 1 }, /* 延迟1us */
.it_interval = {.tv_sec = 0, .tv_usec = 1000} /* 周期1ms */
};
if (!schedule.initialized)
{
memset(schedule.tasks, 0, sizeof(schedule.tasks));
// errno = 0;
signal(SIGALRM, timer_handle); // 注册信号处理函数
if (0 != errno)
{
printf("[%s][%d]: %s\n", __func__, __LINE__, strerror(errno));
return errno;
}
if (0 != setitimer(ITIMER_REAL, &timervar, NULL))
{
printf("[%s][%d]: %s\n", __func__, __LINE__, strerror(errno));
return errno;
}
schedule.initialized = 1;
}
for (int i = 0; i < MAX_TASK; i++)
{
if (schedule.tasks[i].used && task == schedule.tasks[i].taskhandle)
{
// printf("%s already added\n", taskname);
schedule.tasks[i].delay = delay;
schedule.tasks[i].period = period;
return 0;
}
}
for (int i = 0; i < MAX_TASK; i++)
{
if (!schedule.tasks[i].used)
{
schedule.tasks[i].taskhandle = task;
memcpy(schedule.tasks[i].taskname, taskname,
strlen(taskname) < MAX_TASK_NAME ? sizeof(taskname) : MAX_TASK_NAME - 1);
schedule.tasks[i].delay = delay;
schedule.tasks[i].period = period;
schedule.tasks[i].value = delay;
schedule.tasks[i].used = 1;
return 0;
}
}
return -1;
}
int del_timer(void (*task)())
{
if (!schedule.initialized)
{
return 0;
}
for (int i = 0; i < MAX_TASK; i++)
{
if (schedule.tasks[i].used && task == schedule.tasks[i].taskhandle)
{
schedule.tasks[i].used = 0;
return 0;
}
}
return 0;
}
int show_timer()
{
char buffer[21] = {};
if (!schedule.initialized)
{
return 0;
}
printf("%-20s %-20s %-20s %-20s %-20s\n", "TaskId", "TaskName", "Delay(ms)", "Period(ms)", "NextTime(ms)");
for (int i = 0; i < MAX_TASK; i++)
{
if (schedule.tasks[i].used)
{
memcpy(buffer, schedule.tasks[i].taskname, 20);
printf("%-20p %-20s %-20ld %-20ld %-20ld\n", schedule.tasks[i].taskhandle, buffer, schedule.tasks[i].delay,
schedule.tasks[i].period, schedule.tasks[i].value);
}
}
printf("\n");
return 0;
}
#include "schedule.h"
#include <stdio.h>
void task2s()
{
static int count = 0;
printf("[%s][%d]: %d...\n", __func__, __LINE__, count++);
if (count > 10)
{
DelTimer(task2s);
}
}
void task3s()
{
static int count = 0;
printf("[%s][%d]: %d...\n", __func__, __LINE__, count++);
}
void task5s()
{
static int count = 0;
printf("[%s][%d]: %d...\n", __func__, __LINE__, count++);
}
int main(int argc, char const *argv[])
{
AddTimer(task2s, 7 * 1000, 2 * 1000);
AddTimer(task3s, 0, 3 * 1000);
AddTimer(task5s, 0, 5 * 1000);
while (1)
{
;
}
return 0;
}