`
zn108zn
  • 浏览: 14691 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

GNU/Linux 编程中的定时器

 
阅读更多

GNU/Linux 编程中的定时器
2011年06月08日
  GNU/Linux 编程中的定时器
  在Linux C/C++编程中GNU C库提供了多种定时器实现。主要有4种:
  1、alarm方式:
  sigaction/signal, 和alarm等函数实现;
  2、setitimer方式:
  sigaction/signal, setitimer/setitimer等函数实现;
  3、timer_create方式:
  timer_create、timer_settime等函数实现;
  4、timerfd_create方式:
  timerfd_settime、timerfd_settime等函数实现;
  (1)和(2)可以归为一种,都是使用SIGALRM信号实现定时器的到期
  通知。而(4)是通过文件描述符实现的,你可以使用select(2),
  poll(2)和epoll(7)来监测由timerfd_create返回的文件描述符,以获
  知定时器到期。
  文章最后的C代码使用方法(3)。在我的fedora 11中GNU C库会启动
  一个线程来操作这两个定时器,并且该线程在两个定时器删除之
  前始终存在。
  方法(3)和(4)都可以在同一个进程中同时使用多个定时器,
  不同定时器之间互不干扰。
  编译:
  gcc -g -W -Wall -Wextra -std=gnu99 -o mytest main.c -lrt
  执行:
  ./mytest
  参考文献:
  timer_create(2), timerfd_create(2), setitimer(2),
  signal(2), sigaction(2), alarm(2), time(7)
  下面只是一个简陋的事例代码,有许多不适当的地方。
  ================================================== ===================
  main.c:
  // 2010年 05月 19日 星期三 08:42:14 CST
  // author: 李小丹(Li Shao Dan) 字 殊恒
  // K.I.S.S
  // S.P.O.T
  /*
  * Copyright ?? 2010,2011 李小丹(Li Shao Dan)
  */
  #include 
  #include 
  #include 
  #include 
  #include 
  #include 
  /*void sig_handler(int s)
  {
  psignal(s, "Hello,world");
  }*/
  void timer_thread(union sigval v)
  {
  printf("hello,world! %d\n", v.sival_int);
  }
  int main()
  {
  /*struct sigaction sa;
  memset(&sa, 0, sizeof(sa));
  sa.sa_handler = sig_handler;
  sa.sa_flags = 0;
  sigemptyset(&sa.sa_mask);
  if(sigaction(SIGUSR1, &sa, 0) < 0) {
  perror("sigaction");
  exit(1);
  }
  if(sigaction(SIGUSR2, &sa, 0) < 0) {
  perror("sigaction");
  exit(1);
  }*/
  timer_t t1, t2;
  struct sigevent se;
  memset(&se, 0, sizeof(struct sigevent));
  se.sigev_value.sival_int = 999;
  //se.sigev_signo = SIGUSR1;
  //se.sigev_notify = SIGEV_SIGNAL;
  se.sigev_notify = SIGEV_THREAD;
  se.sigev_notify_function = timer_thread;
  if(timer_create(CLOCK_REALTIME, &se, &t1) < 0) {
  perror("timer_create");
  exit(1);
  }
  se.sigev_value.sival_int = 777;
  //se.sigev_signo = SIGUSR2;
  if(timer_create(CLOCK_REALTIME, &se, &t2) < 0) {
  perror("timer_create");
  exit(1);
  }
  struct itimerspec it;
  it.it_interval.tv_sec = 3;
  it.it_interval.tv_nsec = 0;
  it.it_value.tv_sec = 0;
  it.it_value.tv_nsec = 20000;
  if(timer_settime(t1, 0, &it, 0) < 0) {
  perror("timer_settime");
  exit(1);
  }
  it.it_interval.tv_sec = 5;
  it.it_interval.tv_nsec = 0;
  it.it_value.tv_sec = 0;
  it.it_value.tv_nsec = 50000;
  if(timer_settime(t2, 0, &it, 0) < 0) {
  perror("timer_settime");
  exit(1);
  }
  pause();
  return 0;
  }
分享到:
评论

相关推荐

    Linux编程从入门到精通

    linux内核编程 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分 Linux内核 前言 第1章 硬件基础与软件基础 6 1.1 硬件基础 6 1.1.1 CPU 7 1.1.2 存储器 8 1.1.3 总线 8 1.1.4 控制器和外设 8 ...

    linux编程白皮书

    本书对Linux操作系统及其编程作了整体的介绍,以支持用于开发软件的公开源码模型。对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的...

    LINUX编程白皮书 (全集)

    8.2 Linux中的TCP/IP网络层次结构 95 8.3 BSD套接字接口 96 8.4 INET的套接字层 97 8.4.1 创建BSD套接字 98 8.4.2 为INET BSD Socket绑定地址 99 8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 ...

    Linux编程资料

    8.2 Linux中的TCP/IP网络层次结构 95 8.3 BSD套接字接口 96 8.4 INET的套接字层 97 8.4.1 创建BSD套接字 98 8.4.2 为INET BSD Socket绑定地址 99 8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 ...

    LINUX编程白皮书

    非常全的 讲linux编程的经典书籍。 本书对Linux操作系统及其编程作了整体的介绍,以支持用于开发软件的公开源码模型。对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多...

    Linux编程白皮书

    8.2 Linux中的TCP/IP网络层次结构 95 8.3 BSD套接字接口 96 8.4 INET的套接字层 97 8.4.1 创建BSD套接字 98 8.4.2 为INET BSD Socket绑定地址 99 8.4.3 建立INET BSD Socket连接 99 8.4.4 INET BSD Socket侦听 100 ...

    清华大学Linux操作系统原理与应用

    附录D Linux编程基础(C语言环境) 233 D.1 Linux编程常识 233 D.1.1 相关标准(ANSI C、POSIX、SVID、XPG) 233 D.1.2 函数库和系统调用 234 D.1.3 在线文档(man、info、HOWTO) 235 D.1.4 C语言编程风格 237 D.2 ...

    Android驱动开发权威指南

    8.3 Linux定时器 8.4 Linux延时处理 8.4.1短延时 8.4.2长延时 8.4.3睡眠延时 第9章Linux设备驱动中的并发 9.1 Linux中的并发与竞争 9.2 Linux中常用的同步访问技术 9.2.1中断屏蔽 9.2.2原子操作 9.2.3自旋锁 9.2.4...

    Rust 堆栈式协程库

    支持 x86_64 GNU/Linux、x86_64 Windows、x86_64 Mac OS。用法用 May 实现的一个简单的回显服务器:#[macro_use]externcrate may;use may:: net:: TcpListener;use std:: io:: {Read, Write};fnmain () {let lis

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

     本书适合中高级linux开发人员阅读。 目录 第1章 引言1 1.1 演进1 1.2 gnu copyleft2 1.3 kernel.org2 1.4 邮件列表和论坛3 1.5 linux发行版3 1.6 查看源代码4 1.7 编译内核7 1.8 可加载的模块...

    精通LINUX设备驱动程序开发

    目 录 第1章 引言 1 1.1 演进 1 1.2 gnu copyleft 2 1.3 kernel.org 2 1.4 邮件列表和论坛 3 1.5 linux发行版 3 1.6 查看源代码 4 1.7 编译内核 7 1.8 可加载的模块 8 1.9 整装待发 9 第2章 内核 11 2.1...

    精通qt4编程(源代码)

    本章一一介绍了这些部件,并举例说明了它们在图形用户界面编程中的应用。 121 \中级篇 第6章 2D绘图 蔡志明本章内容较多,包括Qt的绘图要素、图形变换与坐标系统、绘图设备、图像处理、图像打印等。最后讲解了Qt 4...

    ARM应用系统开发详解

    6.2.4 定时器工作原理与编程示例 6.2.5 GDMA工作原理与编程示例 6.2.5 IIC总线控制器工作原理 6.2.5 以太网控制器工作原理 6.2.6 Flash存储器工作原理与编程示例 6.3 BootLoader简介 6.4 本章小节 第7章 嵌入式...

    精通Qt4编程(第二版)源代码

    本章一一介绍了这些部件,并举例说明了它们在图形用户界面编程中的应用。 121 \中级篇 第6章 2D绘图 蔡志明本章内容较多,包括Qt的绘图要素、图形变换与坐标系统、绘图设备、图像处理、图像打印等。最后讲解了Qt 4...

Global site tag (gtag.js) - Google Analytics