Linux编程定时执行某函数



前言:

linux中信号提供了软中断的作用。提供了一种处理异步时间的方法 ,  可以通过信号合理的安排异步任务。

linux定义了以下主要的系统信号:

名称                        默认动作                        说明

SIGHUP                   终止进程                        终端线路挂断

SIGINT                   终止进程                        中断进程

SIGQUIT                 建立CORE文件                 终止进程,并且生成core文件

SIGILL                    建立CORE文件                非法指令

SIGTRAP                 建立CORE文件                 跟踪自陷

SIGBUS                  建立CORE文件                总线错误

SIGSEGV                建立CORE文件                段非法错误

SIGFPE                  建立CORE文件                浮点异常

SIGIOT                  建立CORE文件                 执行I/O自陷

SIGKILL                 终止进程                      杀死进程

SIGPIPE                终止进程                      向一个没有读进程的管道写数据

SIGALARM             终止进程                     计时器到时

SIGTERM              终止进程                       软件终止信号

SIGSTOP              停止进程                     非终端来的停止信号

SIGTSTP              停止进程                      终端来的停止信号

SIGCONT              忽略信号                    继续执行一个停止的进程

SIGURG                忽略信号                       I/O紧急信号

SIGIO                  忽略信号                       描述符上可以进行I/O

SIGCHLD              忽略信号                    当子进程停止或退出时通知父进程

SIGTTOU              停止进程                      后台进程写终端

SIGTTIN               停止进程                         后台进程读终端

SIGXGPU               终止进程                       CPU时限超时

SIGXFSZ              终止进程                        文件长度过长

SIGWINCH           忽略信号                     窗口大小发生变化

SIGPROF             终止进程                       统计分布图用计时器到时

SIGUSR1             终止进程                   用户定义信号1

SIGUSR2             终止进程                   用户定义信号2

SIGVTALRM        终止进程                     虚拟计时器到时

应用:

下面我们应用SIGALARM,设置每秒执行一次的动作:

    struct itimerval oneSec;

     signal(SIGALRM, Demo_updateTime);
        oneSec.it_value.tv_sec = 1;
        oneSec.it_value.tv_usec = 0;
        oneSec.it_interval.tv_sec = 1;
        oneSec.it_interval.tv_usec = 0;
        setitimer(ITIMER_REAL, &oneSec, NULL);

Demo_updateTime()函数就是注册的每秒执行一次的函数。

 switch(signo){
        case SIGALRM:
            time(&timeval) ;

            localtime_r(&timeval, &tmCur) ;

            //update date only once one day
            if(tmOld.tm_mday != tmCur.tm_mday)
            {
                char temp[40];

                //get day of week from this call only.
                ctime_r(&timeval, temp);

                sprintf(osdStr,"%04d-%02d-%02d ",tmCur.tm_year+1900,
                        tmCur.tm_mon+1,tmCur.tm_mday);

                strncat(osdStr,temp,3);

            }

实现精度较高的定时功能的话,就要使用setitimer函数。

int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

which为定时器类型,setitimer支持3种类型的定时器:

ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。

ITIMER_VIRTUAL: -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。

ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。

setitimer()调用成功返回0,否则返回-1。

struct itimerval {

struct timeval it_interval;

struct timeval it_value;

};

struct timeval {

long tv_sec;

long tv_usec;

};

需要signal.h和sys/time.h

it_interval指定间隔时间,it_value指定初始定时时间。如果只指定it_value,就是实现一次定时;如果同时指定 it_interval,则超时后,系统会重新初始化it_value为it_interval,实现重复定时;两者都清零,则会清除定时器。

tv_sec提供秒级精度,tv_usec提供微秒级精度,以值大的为先,注意1s = 1000000us。

ovalue用来保存先前的值,常设为NULL。

如果不需要这么高的精度,可用用alarm()函数:

ALARM介绍

alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。

所需头文件

  #include<unistd.h>

函数原型

  unsigned int alarm(unsigned int seconds)

函数参数

  seconds:指定秒数

函数返回值

  成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。

  出错:-1

Linux编程定时执行某函数

时间: 2024-09-28 01:52:55

Linux编程定时执行某函数的相关文章

linux编程中接收主函数返回值以及错误码提示

程序A创建子进程,并调用进程B,根据不调用的不同情况,最后显示结果不同. #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <errno.h> int main() { pid_t pid, rpid; int stat; if ((pid = fork()) < 0) { perror("for

在Linux中定时执行一个程序的方法之at命令

/*********************************************************************  * Author  : Samson  * Date    : 04/29/2014  * Test platform:  *              3.11.0-12-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

linux crontab定时执行

#利用crontab定时执行url研究了两种简单方式#一利用lynx访问url yum install lynxservice crond startcrontab -einsert键* * * * * lynx -dump http://192.168.0.10/gas_station_erp/index.php/socket/SendDev/getDevInfoesc :wqservice crond restart #* * * * * 表示每分钟执行一次 #二调用sh脚本 service

linux下定时执行脚本

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: 1.cron的启动 /sbin/service crond start //启动服务/sbin/service crond stop //关闭服务/sbin/service crond restart //重启服务/sbin/service crond reload //重新载入配置 你也可以将这个服务在系统启动的时候自动启动:

Linux下定时执行脚本(转自Decode360)

文章来自:http://www.blogjava.net/decode360/archive/2009/09/18/287743.html Decode360's Blog  老师(业精于勤而荒于嬉 QQ:150355677 MSN:[email protected]) 菜鸟表示不会写shell脚本,但还是能够看懂的,昨天因为传了太多数据,结果namenode进入了safe mode,然后小伙伴赶紧就暂停了每天早晨4点自动执行的数据合并压缩和传输的脚本,今天我自己准备改,才发现这篇博文. 先说说

cocos2d调度器(定时执行某函数)

调度器(scheduler) 继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止. Cocos2d-x暂停时,调度器也会停止.当Cocos2d-x重新开始时,调度器也会自动继续启动. Cocos2d-x封装了一个供各种不同平台使用的调度器,使用此调度器你不用关心和跟踪你所设定的定时对象的销毁和停止,以及崩溃的风险. 基础用法 游戏中我们经常会随时间

crontab(linux下定时执行任务命令)

在linux在可以通过在脚本里(列如sh)写如日常需要进行的操作,然后通过crontab定时运行脚本. Linux下的任务调度分为两类,系统任务调度和用户任务调度. 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘.日志清理等.在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件. 用户任务调度:用户定期要执行的工作,比如用户数据备份.定时邮件提醒等.用户可以使用 crontab 工具来定制自己的计划任务.所有用户定义的crontab 文件都被保存在 /var/s

Linux中定时执行DB2的存储过程

一.需求说明 将DB2中的实时数据按天和小时汇总到汇总表中. 二.过程及步骤 第一步:编写DB2存储过程. 1. 在Dbvisualizer中新建SQL editor. 2. 代码: 1 --/ 2 CREATE PROCEDURE "NCPOLLDATA"."AGGREGATE_ENTITY_DAILY" 3 () 4 LANGUAGE SQL 5 SPECIFIC SQL160427123206300 6 BEGIN 7 --declare varibles 8

Linux crontab定时执行任务

1.设置定时任务的命令是crontab -e首次使用crontab的时候会让你选择编辑工具,看个人喜好了.选择一个即可.如果以后想换默认编辑工具,可以按照下面的提示运行命令"select-editor"进行选择.Select an editor.  To change later, run 'select-editor'.1. /bin/ed2. /bin/nano        <---- easiest3. /usr/bin/vim.tiny Choose 1-3 [2]: