查看: 1619|回复: 1

[i.MX6ULL竞赛专区] 【我的项目666+AD采集项目】linux 定时函数的使用

[复制链接]
  • TA的每日心情
    开心
    2018-6-27 13:15
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    12

    主题

    22

    帖子

    0

    注册会员

    Rank: 2

    积分
    190
    最后登录
    2019-6-24
    发表于 2018-7-20 08:45:24 | 显示全部楼层 |阅读模式
    本帖最后由 apple_9938 于 2018-7-20 08:47 编辑

    《转载》linux操作系统为每一个进程提供了3个内部计时器。
    ITIMER_REAL;ITIMER_VIRTUAL;ITIMER_PROF.

    ITIMER_REAL:给定一个指定的时间间隔,按照实际的时间来减少这个计数,当时间间隔为0的时候发出SIGALRM信号。
    ITIMER_VIRTUAL:给定一个时间间隔,当进程执行的时候才减少计数,时间间隔为0的时候发出SIGVTALRM信号。
    ITIMER_PROF:给定一个时间间隔,当进程执行或者是系统为进程调度的时候,减少计数,时间到了,发出SIGPROF信号,这个和TIMER_VIRTUAL联合,常用来计算系统内核时间和用户时间。

    看一下getitimer的数据手册
    getitimer, setitimer - get or set value of an interval timer

    #include <sys/time.h>
    int getitimer(int which, struct itimerval *value);
    int setitimer(int which, char struct itimerval *value, struct itimerval *ovalue);

    ITIMER_REAL;ITIMER_VIRTUAL;ITIMER_PROF.就是三个定时器,在使用的时候,当其中的任何一个时间到了,都会给进程发送一个信号,然后定时器重新被装填,重新开始定时动作。

    它们对应的信号
    ITIMER_REAL    ---- SIGALRM
    ITIMER_VIRTUAL ---- SIGVTALRM
    ITIMER_PROF    ---- SIGPROF

    函数中的which就是选择这三个定时器中的一个。

    下面是描述时间结构体value的
    struct itimerval {
        struct timeval it_interval; //下一个值
        struct timeval it_value;    //当前的值
    };
    struct timeval {
        long tv_sec;  //秒
        long tv_usec; //微秒
    };
    一个表示时间的结构体,一个含有时间结构体的结构体。

    使用定时器的时候,首先定义一个时间结构体,然后初始化这个时间结构体的秒和毫秒。然后使用setitimer函数,第一个参数指定使用哪一个定时器,第二个参数就是传递进去的时间结构体,第三个参数为NULL。这样就设定好了一个定时器了。它就可以开始工作了。

    说一下返回值: 函数调用成功返回0, 错误返回-1,并且设置出错值errno。
    当出错的时候:可能是value或者是ovalue指针无效;或者是定时器搞错了,不是这三个中的一个;或者是时间结构体中的毫秒超出了0到999999的范围。

    由于当定时器的时间到了的时候会引发一个信号,因此我们必须对信号进行处理,因此需要了解一下信号处理的函数。
    我们可以修改linux系统信号的相关联的动作,也就是当捕获到某个信号时需要执行什么函数。有点像是可以更改函数指针指向的函数一样。
    有这么一个函数可以完成这个问题:sigaction。
    也就是sig-action,signal-action,信号动作。
    #include<sginal.h>
    int sigaction(int signo, const struct sigacton *rstrict act, struct sigaction *restrict oact);
    这个函数具有三个参数,第一个是信号的名字,直接写系统的信号名,比如SIGALRM之类的。第二个参数是一个结构体,表述了信号相关的东西,我们 修改的函数指针就在里面。第三个函数是用来返回的,返回该信号的上一个动作,也就是上一个这个信号结构体里面的函数指针指向的函数。

    下面看一下这个信号结构体。
    struct sigaction {
        void (*sa_handler)(int);
        sigset_t sa_mask;
        int sa_flags;

        void (*sa_sigaction)(int, siginfo_t *, void *);
    };
    在使用的时候,sa_handler和sa_sigaction只是用一个。
    sa_mask是和sa_handler一起的。
    sa_mask表示了一个信号集合,在调用sigaction之前要先用sigemptyset把sa_mask加入到进程的信号屏蔽字当中。
    sigemptyset函数初始化一个sigset_t *类型的信号集合,清除里面的所有信号。
    使用函数sigaction(SIGALRM, &tact, NULL)就是把SIGALRM的信号的触发动作变成tact结构体中的sa_handler或者sa_sigaction所指向的函数了。

    测试程序:
    #include<sys/time.h>  #include<stdio.h>  
    #include<unistd.h>  
    #include<signal.h>
    #include<string.h>  
    static char msg[] = "time is running out./n";
    static int len;  
    void prompt_info(int signo)  
    {      
        write(STDERR_FILENO, msg, len);
    }  
    void init_sigaction(void)  
    {      
    struct sigaction tact;      
    tact.sa_handler = prompt_info;      
    tact.sa_flags = 0;     
    sigemptyset(&tact.sa_mask);      
    sigaction(SIGALRM, &tact, NULL);
    }  
    void init_time()   
    {     
    struct itimerval value;      
    value.it_value.tv_sec = 0;      
    value.it_value.tv_usec = 200000;      
    value.it_interval = value.it_value;      
    setitimer(ITIMER_REAL, &value, NULL);  
    }  
    int main()
    {     
    len = strlen(msg);     
    init_sigaction();     
    init_time();     
    while(1);     
    exit(0);  
    }


    评分

    参与人数 1 +3 收起 理由
    NXP管管 + 3

    查看全部评分

    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-10-17 09:43
  • 签到天数: 47 天

    [LV.5]常住居民I

    21

    主题

    135

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    487
    最后登录
    2022-10-24
    发表于 2018-7-25 10:45:33 | 显示全部楼层
    赞赞赞赞
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 18:23 , Processed in 0.108087 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表