Linux内核API del_timer

del_timer函数功能描述:函数del_timer( )用于将处于非活动状态的定时器从动态定时器链表中删除。

del_timer文件包含

#include<linux/timer.h>

del_timer函数定义

在内核源码中的位置:linux-3.19.3/kernel/time/timer.c

函数定义格式:int del_timer(struct timer_list * timer)

del_timer输入参数说明

  • 此函数的输入参数是struct timer_list类型的变量,此变量用于存放动态定时器,其定义及详细解释参考函数add_timer( )分析文档的输入参数说明部分。

del_timer返回参数说明

  • 函数del_timer( )返回整数,可能的取值是0和1,返回1说明删除的定时器处于激活状态,删除成功;返回0说明删除的定时器已经处于到期函数执行状态或已经不存在,删除无效。

del_timer实例解析

编写测试文件:del_timer.c

头文件及全局变量声明如下:

#include <linux/module.h>
#include<linux/timer.h>
MODULE_LICENSE("GPL");
struct timer_list my_timer;      //定义一个静态全局变量

自定义定时器函数:

// 自定义一个定时器函数,此函数在此只有输出的功能
void my_timer_function(unsigned long data)
{
    printk("In the my_timer_function\n");
    printk("the jiffies is :%ld\n", jiffies);
    struct timer_list *mytimer = (struct timer_list *)data;
    printk("the expries of my_timer1 is :%ld\n", mytimer->expires);
    int result=del_timer(&my_timer);                           //删除定时器变量
    printk("the result of the del_timer is:%d\n", result);  //显示删除结果
}

模块初始化函数:

int __init del_timer_init(void)
{
    printk("into del_timer_init\n");
    printk("the jiffies is :%ld\n", jiffies);
    init_timer(&my_timer);                 //调用init_timer初始化变量

    // HZ=250;初始化字段expires,使其值在当前节拍的基础上增加250个节拍
    my_timer.expires = jiffies + 1*HZ;
    my_timer.data = &my_timer;             //初始化字段data,其值指向变量的地址

    // 初始化字段function,其值是自定义的定时器函数
    my_timer.function = my_timer_function;
    add_timer(&my_timer);                  //激活动态定时器
    int result=del_timer(&my_timer);       //删除定时器变量
    printk("the result of the del_timer is:%d\n", result);  //显示删除结果
    add_timer(&my_timer);                  //再次激活动态定时器
    printk("out del_timer_init.\n");
    return 0;
}

模块退出函数:

void __exit del_timer_exit(void)
{
    // 删除定时器变量,此时的定时器已经不存在,在此只是验证函数的功能
    int result=del_timer(&my_timer);
    printk("the result of the del_timer is:%d\n", result);  //显示删除结果
    printk("my_timer is deleted! \n");
    printk("Goodbye del_timer\n");
}

模块初始化及退出函数调用:

module_init(del_timer_init);
module_exit(del_timer_exit);

实例运行结果及分析:

执行命令insmod del_timer.ko插入模块,然后输入命令dmesg -c查看内核输出信息,出现如图A所示结果。

Linux内核API del_timer

执行命令rmmod del_timer.ko删除模块,然后输入命令dmesg -c查看内核输出信息,出现如图B所示结果。

Linux内核API del_timer

结果分析:

由图A可以判断函数add_timer( )能正常执行,将初始化之后的定时器加入到动态定时器链表中;对于函数del_timer( )被调用三次,第一次返回1,此时定时器正处于激活状态,但还未到期,函数del_timer( )完成真正意义上的定时器删除,即将定时器从动态定时器链表中删除。定时器删除之后,再次调用add_timer( )将定时器插入动态定时器链表,这样保证定时器到期时到期处理函数会被调度。第二次调用del_timer( )时返回0,此时定时器已到期,到期处理函数正在执行,此时无法删除,对动态定时器链表没有影响。第三次调用函数del_timer( )是在模块退出时,该函数返回0,此时定时器已从动态定时器链表中删除。

赞(1)
未经允许不得转载:极客笔记 » Linux内核API del_timer
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址