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

📄 schedule.c

📁 linux下的日程表开发
💻 C
字号:
/*==========================================================
*  Name: schedule.c
*  Copyright:
*  Author: qsrong
*  Date: 16/04/09
*  Description: schedule.c schedule.h
               日程表
*/
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
#include <db.h>
#include "schedule.h"
#include <pthread.h>

void print_error(int ret)
{
if(ret!=0)
     printf("ERROR:%s\n",db_strerror(ret));
}

void init_DBT(DBT *key,DBT *data)
{
     memset(key,0,sizeof(DBT));
     memset(data,0,sizeof(DBT));

}

/*==========================================================
*  function:  add_matter()
*  Description:  向日程表中添加数据,以数据库方式存储
		     时间为key,
*/
void add_matter( )
{
	DB *dbp;
 	DBT key,data;
 	DBC * schedule_db_cur;
	u_int32_t flags;
	int ret;
	SCHEDULE schedule;
	struct tm warn_time;
	time_t t_day;
    int sec;
	ret=db_create(&dbp,NULL,0);
	print_error(ret);
	flags=DB_CREATE;
	/*创建名为single.db的数据库*/
	ret=dbp->open(dbp,NULL,"schedule.db",NULL,DB_BTREE,flags,0664);
	print_error(ret);
	dbp->cursor(dbp,NULL,&schedule_db_cur,0);
	init_DBT(&key,&data);
	memset(&schedule,0,sizeof(SCHEDULE));
	key.size=sizeof(int);
	key.data=&schedule.warn_sec;
	data.data=&schedule;
	data.ulen=sizeof(SCHEDULE);
	data.flags=DB_DBT_USERMEM;
	//添加记录
	printf("please enter the time you want alarm you as yyyy-mm-dd-hh-mm(as key):\n");
    memset(&warn_time, 0, sizeof(warn_time));
    //printf("Enter the time now\n");
    //printf("\nPlease enter the year as yyyy:");
    //scanf("%d",&warn_time.tm_year);
	//warn_time.tm_year=warn_time.tm_year-1900;
	warn_time.tm_year=110;
    printf("\nPlease enter the  mon ad mm:");
    scanf("%d",&warn_time.tm_mon);
    printf("\nPlease enter the day as dd:");
    scanf("%d",&warn_time.tm_mday);
    printf("\nPlease enter the hour as hh:");
    scanf("%d",&warn_time.tm_hour);
    printf("\nPlease enter the min as mm:");
    scanf("%d",&warn_time.tm_min);
    warn_time.tm_sec = 0;
	warn_time.tm_isdst=0;
	printf("warmtime %d\n",warn_time.tm_yday);
    t_day=mktime(&warn_time);    //将输入的标准格式时间转化为距离1900的秒 作为key
    printf("%d",t_day);
	schedule.warn_sec=t_day;
	printf("\nPlease enter the matter you want the record:  ");
	scanf("%s",&schedule.warn_matter);
	/*分别对关键字和数据赋值和规定长度*/
	key.data=&(schedule.warn_sec);
	key.size=sizeof(int);
	data.data=&schedule;
	data.size=sizeof(SCHEDULE);

	ret=dbp->put(dbp,NULL,&key,&data,DB_NOOVERWRITE);

	print_error(ret);

	if(dbp!=NULL)
	dbp->close(dbp,0);
}

/*==========================================================
*  function:  del_matter(long real_time)
*  Description:  删除过期的任务
		      删除数据库中为real_time的数据,
*/
void del_matter(long real_time)
{
	DB *dbp;
 	DBT key,data;
 	DBC * schedule_db_cur;
	u_int32_t flags;
	int ret;
	SCHEDULE schedule;
	ret=db_create(&dbp,NULL,0);
	print_error(ret);
	///*创建数据库*/
	flags=DB_CREATE;
	
	ret=dbp->open(dbp,NULL,"schedule.db",NULL,DB_BTREE,flags,0664);
	print_error(ret);
	dbp->cursor(dbp,NULL,&schedule_db_cur,0);
	init_DBT(&key,&data);
	memset(&schedule,0,sizeof(SCHEDULE));
	
	dbp->cursor(dbp,NULL,&schedule_db_cur,0);	
	schedule.warn_sec=real_time;
	key.size=sizeof(int);
	key.data=&schedule.warn_sec;					
	//删除记录
	while((ret=schedule_db_cur->get(schedule_db_cur,&key,&data,DB_SET))==0)
	{
	schedule_db_cur->del(schedule_db_cur,0);
	}
	
	if(schedule_db_cur !=NULL)
	schedule_db_cur->close(schedule_db_cur);
	if(dbp!=NULL)
	dbp->close(dbp,0);
 	
}


/*==========================================================
*  function: get_ring_matter(char *matter) 
*  Description: get the nearly matter need to be ring


*/
long  get_ring_matter(char *matter)
{
	
	long min_sec=0;
	long get_warn_sec;
	DB *dbp;
 	DBT key,data;
 	DBC * schedule_db_cur;
 	SCHEDULE schedule;
	u_int32_t flags;
	int ret;	
	ret=db_create(&dbp,NULL,0);
	print_error(ret);
	flags=DB_CREATE;
	ret=dbp->open(dbp,NULL,"schedule.db",NULL,DB_BTREE,flags,0664);
	print_error(ret);
	dbp->cursor(dbp,NULL,&schedule_db_cur,0);
	init_DBT(&key,&data);
	memset(&schedule,0,sizeof(SCHEDULE));
		
	key.size=sizeof(int);
	key.data=&schedule.warn_sec;
	data.data=&schedule;
	data.ulen=sizeof(SCHEDULE);
	data.flags=DB_DBT_USERMEM;
       
	printf("ALL records has been listed here.\n");
	ret = schedule_db_cur->get(schedule_db_cur,&key,&data,DB_NEXT);
	min_sec=schedule.warn_sec;
	strcpy(matter,schedule.warn_matter);
	while((ret = schedule_db_cur->get(schedule_db_cur,&key,&data,DB_NEXT)) == 0)
    {
	printf("Record:");
	printf("%d   ",(int*)(schedule.warn_sec));
	get_warn_sec=schedule.warn_sec;
	if(min_sec>=get_warn_sec)
		{
			min_sec=get_warn_sec;
			strcpy(matter,schedule.warn_matter);
		}
       
	}
	if(ret != DB_NOTFOUND)
	{
 	printf("Not found!\n");
	}
	if(schedule_db_cur !=NULL)
	schedule_db_cur->close(schedule_db_cur);
	if(dbp!=NULL)
	dbp->close(dbp,0);
	return min_sec;
}

void schedule_main()
{
	char matter[1024];
	long ring_sec;
	time_t timep;
       while(1)
       	{	
       		
			time(&timep);
			printf("**%d",timep);
       		ring_sec=get_ring_matter(matter);
			if(ring_sec==timep)
			 {
			 	printf("%s",matter);
				del_matter(ring_sec);
			 }
			
       	}


}

int main()
{
 //add_matter( );
 char s[1024];
 //get_ring_matter(s);
 //printf("end matter %s\n",s);
 schedule_main();
 return 0;
}
/*
void_sec printMsg(int);

int main()
{
 // Get system call result to determine successful or failed
 int res = 0;
 // Register printMsg to SIGALRM
 signal(SIGALRM, printMsg);


 res = alarm(2);
 if (res)
 {
  printf("Set timer failed!!\n");
 }

 // Always sleep to catch SIGALRM signal
 while (1)
 {
  pause();
 }

 return 0;
}

vowarn_sec printMsg(int num)
{
 printf("%s", "Hello World!!\n");
}
*/

⌨️ 快捷键说明

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