- 浏览: 153998 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
Linux下的定时器有两种,以下分别介绍:
1、alarm
如果不要求很精确的话,用 alarm() 和 signal() 就够了
unsigned int alarm(unsigned int seconds)
专门为SIGALRM信号而设,在指定的时间seconds秒后,将向进程本身发送SIGALRM信号,又称为闹钟时间。进程调用alarm后,任何以前的alarm()调用都将无效。如果参数seconds为零,那么进程内将不再包含任何闹钟时间。如果调用alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigalrm_fn(int sig)
{
/* Do something */
printf("alarm!\n");
alarm(2);
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(2);
/* Do someting */
while(1) pause();
}
2、setitimer
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
setitimer()比alarm功能强大,支持3种类型的定时器:
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : 以该行程真正有执行的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以行程真正有执行及在核心中所费的时间来计算,它送出SIGPROF信号。
Setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。
Setitimer()调用成功返回0,否则返回-1。
下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号::
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
int sec;
void sigroutine(int signo){
switch (signo){
case SIGALRM:
printf("Catch a signal -- SIGALRM \n");
signal(SIGALRM, sigroutine);
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM \n");
signal(SIGVTALRM, sigroutine);
break;
}
return;
}
int main()
{
struct itimerval value, ovalue, value2;
sec = 5;
printf("process id is %d ", getpid());
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue);
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
for(;;)
;
}
该例子的屏幕拷贝如下:
localhost:~$ ./timer_test
process id is 579
Catch a signal – SIGVTALRM
Catch a signal – SIGALRM
Catch a signal – SIGVTALRM
Catch a signal – SIGVTALRM
Catch a signal – SIGALRM
Catch a signal –GVTALRM
注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
1、alarm
如果不要求很精确的话,用 alarm() 和 signal() 就够了
unsigned int alarm(unsigned int seconds)
专门为SIGALRM信号而设,在指定的时间seconds秒后,将向进程本身发送SIGALRM信号,又称为闹钟时间。进程调用alarm后,任何以前的alarm()调用都将无效。如果参数seconds为零,那么进程内将不再包含任何闹钟时间。如果调用alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigalrm_fn(int sig)
{
/* Do something */
printf("alarm!\n");
alarm(2);
return;
}
int main(void)
{
signal(SIGALRM, sigalrm_fn);
alarm(2);
/* Do someting */
while(1) pause();
}
2、setitimer
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
setitimer()比alarm功能强大,支持3种类型的定时器:
ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL : 以该行程真正有执行的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF : 以行程真正有执行及在核心中所费的时间来计算,它送出SIGPROF信号。
Setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。
Setitimer()调用成功返回0,否则返回-1。
下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号::
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
int sec;
void sigroutine(int signo){
switch (signo){
case SIGALRM:
printf("Catch a signal -- SIGALRM \n");
signal(SIGALRM, sigroutine);
break;
case SIGVTALRM:
printf("Catch a signal -- SIGVTALRM \n");
signal(SIGVTALRM, sigroutine);
break;
}
return;
}
int main()
{
struct itimerval value, ovalue, value2;
sec = 5;
printf("process id is %d ", getpid());
signal(SIGALRM, sigroutine);
signal(SIGVTALRM, sigroutine);
value.it_value.tv_sec = 1;
value.it_value.tv_usec = 0;
value.it_interval.tv_sec = 1;
value.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &value, &ovalue);
value2.it_value.tv_sec = 0;
value2.it_value.tv_usec = 500000;
value2.it_interval.tv_sec = 0;
value2.it_interval.tv_usec = 500000;
setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
for(;;)
;
}
该例子的屏幕拷贝如下:
localhost:~$ ./timer_test
process id is 579
Catch a signal – SIGVTALRM
Catch a signal – SIGALRM
Catch a signal – SIGVTALRM
Catch a signal – SIGVTALRM
Catch a signal – SIGALRM
Catch a signal –GVTALRM
注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
发表评论
-
c语言链表实现学生管理
2013-10-28 14:13 902#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4731#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 3002gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1359负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 906if(NULL == fgets(msg,100,stdi ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1165nice,renice 指定进程运行的优先级 taskset ... -
c++ 动态内存分配
2013-08-28 22:35 846先看一段代码: [cpp] view plaincopy ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1562>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 691总结: -2> int * a = NUL ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2129最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 712#include <stdlib.h> ... -
feodra 17 安装 chrome
2013-08-04 01:35 7691: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 913Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
c语言api
2013-07-31 21:06 678原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 629#define SS sizeof(int) 5 int ... -
select,epoll,poll比较
2013-07-28 17:13 687select,poll,epoll简介 se ... -
gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
2013-07-22 22:45 910我们用gcc编译程序时,可能会用到“-I”(大写i),“-L” ... -
Linux下如何将进程绑定在特定的CPU上运行
2013-07-22 10:52 990Linux下如何将进程绑定在特定的CPU上运行? 以root用 ... -
linux运维常用命令
2013-07-13 20:40 890推荐一个实用命令:awk '{x+=$2} END {prin ... -
linux 进程通信方式
2013-07-07 20:46 622# 管道( pipe ):管道是一种半双工的通信方式,数据只能 ...
相关推荐
1. **Linux定时器基础** Linux内核中的定时器系统主要分为两种:软定时器(software timers)和硬件定时器(hardware timers)。软定时器基于软件调度,而硬件定时器则依赖于硬件中断来触发。 2. **软定时器...
在这个基于Mini2440开发板的项目中,我们关注的是Linux下的定时器实现,尤其是如何在C语言环境下编写基本的驱动程序和应用程序。Mini2440是一款流行的S3C2440 ARM9开发板,常用于嵌入式系统的学习与开发。 首先,...
综上所述,理解并熟练掌握Linux下的定时器实现方式对于系统级编程和后台服务的开发至关重要。无论是最小堆、红黑树还是时间轮,都有其独特的应用场景和优缺点。在设计和实现定时器时,应根据任务的具体需求,如...
//linux只允许单进程拥有一个定时器,因此在linux下的单进程中要使用多个定时器,则需要自己维护管理 // //这个实现允许用户使用多个自定义的定时器,每个自定义的定时器将周期地被触发直到其被删除。实现的主要思路...
总的来说,CTimer类封装了Linux下的定时器功能,提供了一种方便的方式来在C++项目中实现定时任务,降低了开发者的编程负担,并提高了代码的可复用性。通过理解和使用CTimer,开发者可以更好地掌握Linux系统编程中的...
本节我们将深入探讨Linux环境下如何使用C语言创建基于红黑树(Red-Black Tree)的多线程定时器,以及如何设置定时回调函数,其定时单位精确到毫秒。 首先,我们需要了解什么是定时器。定时器是一种机制,它可以在...
二、Linux定时器 1. **定时器类型**:Linux提供了两种主要的定时器类型:POSIX定时器(`timer_create()`、`timer_settime()`等)和系统调用`alarm()`、`sleep()`。前者更灵活,支持相对和绝对时间,后者简单但功能...
主要是对linux内核中的定时器的使用编写的一个例子,代码中包括timer.c和makefile文件,还有一些已经编译的文件,其中有个timer.ko文件就是内核模块文件,在终端使用 insmod timer.ko就可以插入到linux内核(要与...
基于linux嵌入式系统的定时器开发实验
在Linux操作系统中,内核定时器是系统时间管理的核心组件之一,它允许内核执行特定的任务或函数在预设的时间间隔之后。这个程序展示了如何在Linux内核中创建和使用一个基本的定时器,实现每10秒打印一条消息的功能。...
- 软中断:在某些情况下,定时器的回调可能需要在软中断上下文执行,这意味着它们不能睡眠,但可以快速完成工作。 - 定时器链表:内核维护了一个全局的定时器链表,所有活动的定时器都按到期时间排序在这个链表上,...
根据给定的文件信息,以下是对“Linux下实时定时器的实现及应用”的详细解析,主要涵盖定时器的实现背景、内核中的时钟管理、延时机制、实时时钟的具体实现及其应用。 ### 实时定时器的实现背景 在嵌入式系统开发...
详细描述了Linux下的定时器的原理,实现
可实现Linux下毫秒级的软件定时,但依赖于系统HZ数,如 HZ=100,最小定时为10ms HZ=1000,最小定时才是1ms 理论上可以实现若干个定时器,依赖于系统性能 设计了两种定时方式 STIMER_CYCLE:循环周期定时;STIMER_ONCE:单次...
在Linux系统中,内核定时器是用于在特定时间间隔执行特定操作的重要机制。它们是内核编程中的关键组件,特别是在需要延时或周期性任务的场合。本篇将深入探讨Linux内核定时器的编程,包括如何创建、管理以及它们的...
### WIN和LINUX毫秒定时器 在计算机编程领域中,定时器是极其重要的组成部分之一,尤其是在需要执行周期性任务或需要控制程序运行间隔的情况下。本文将深入探讨Windows和Linux平台上的毫秒级定时器,并提供相关的...
通过编写一个程序来注册三个定时器,分别对实际时间、进程使用CPU时间、用户使用CPU时间进行计时,可以深入理解信号与定时器在Linux环境下的应用。这种练习有助于开发者掌握如何在实际项目中使用这些机制,提高程序...
首先,我们了解下Linux内核定时器的基本概念。Linux内核中的定时器基于硬件定时器,如pit(Programmable Interval Timer)或HPET(High Precision Event Timer)。这些硬件定时器会产生中断,从而触发内核的定时器子...
本文将深入探讨“基于Linux定时器管理器”的相关知识点,包括定时器的类型、工作原理以及如何添加、删除定时器,并对`end_timer_1`这个文件可能涉及的内容进行分析。 首先,让我们了解Linux中的定时器类型。主要有...
本篇文章将深入探讨如何在Linux环境下利用pthread库创建和管理定时器,以及它在实际应用中的作用。 POSIX线程库中的定时器主要由`pthread_cond_t`条件变量和`pthread_mutex_t`互斥锁配合使用,实现定时触发回调函数...