linux应用程序中的延时和定时器

笔记:

在linux应用程序中延时有sleep()、msleep()和usleep()函数之类的延时,也有如下形式的延时:

    struct timeval delay;
    delay.tv_sec = sleepSecond;
    delay.tv_usec = 0;
    select( 0, NULL, NULL, NULL, &delay );

但是基本上都是基于进程休眠的,好像没有循环等待的延时,有待证实,目前没发现。

考虑到一个问题,如果定时发送信号,执行相应一个信号处理函数时,该函数还么有执行完成,另一个信号又来了,怎么处理呢?答案是等待前面一个信号处理完成。

定时器配合kill函数一起使用,可以满足某些想立即执行又要有周期执行相应函数的特殊要求,如下:

/*********************************************************************************
 *      Copyright:  (C) 2014 EAST
 *                  All rights reserved.
 *
 *       Filename:  setitimer.c
 *    Description:  This file
 *
 *        Version:  1.0.0(08/08/2014)
 *         Author:  fulinux <[email protected]>
 *      ChangeLog:  1, Release initial version on "08/08/2014 12:58:48 PM"
 *
 ********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>

static int switch_val = 0;

void sigroutine(int signo){
    switch (signo){
        case SIGALRM:
            printf("Catch a signal -- SIGALRM \n");
            break;
        case SIGVTALRM:
            printf("Catch a signal -- SIGVTALRM \n");
            switch(switch_val){
                case 0:
                    printf ("switch_val =  0\n");
                    break;
                case 1:
                    printf ("switch_val =  1\n");
                    break;
                case 2:
                    printf ("switch_val =  2\n");
                    break;
                case 3:
                    printf ("switch_val =  3\n");
                    break;
                default:
                    return;
            }
            break;
    }
    return;
}
int main()
{
    struct itimerval value, ovalue, value2;          //(1)

    printf("process id is %d\n", 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);     //(2)
    value2.it_value.tv_sec = 0;
    value2.it_value.tv_usec = 1;
    value2.it_interval.tv_sec = 0;
    value2.it_interval.tv_usec = 500000;
    setitimer(ITIMER_VIRTUAL, &value2, &ovalue);

#if 0
    struct timeval delay;
    delay.tv_sec = 0;
    delay.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &delay);
#endif
    switch_val = 1;
    kill(getpid(), SIGVTALRM);
    printf ("fulinux 1\n");

    switch_val = 2;
    kill(getpid(), SIGVTALRM);
    printf ("fulinux 2\n");

    switch_val = 3;
    kill(getpid(), SIGVTALRM);
    printf ("fulinux 3\n");

    for(;;)
        ;
}

linux应用程序中的延时和定时器

时间: 2024-08-26 16:30:52

linux应用程序中的延时和定时器的相关文章

linux c程序中获取shell脚本输出的实现方法

linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作.比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序中通过 system函数来调用shell命令.但是,system函数仅返回命令是否执行成功,而我们可能需要获得shell命令在控制台上输出的结果.例如,执行外部

linux shell脚本中的延时

linux shell脚本中的延时 还是使用 sleep 或usleep函数. 详细如下:     1.sleep : 默认为秒. sleep 1s 表示延迟一秒   sleep 1m 表示延迟一分钟   sleep 1h 表示延迟一小时   sleep 1d 表示延迟一天        2.usleep : 默认以微秒.   1s = 1000ms = 1000000us 原文地址:https://www.cnblogs.com/sea-stream/p/12076906.html

[Android] 在程序中实现延时的常用的两种方式

1.利用Thread类 new Thread(){    @Override    public void run() {      try {            //延时3秒          Thread.sleep(3000);      } catch (InterruptedException e) {            e.printStackTrace();       } //界面跳转      Intent intent = new Intent(MainActivit

让你提前认识软件开发(21):C程序中的定时器

第1部分 重新认识C语言 C程序中的定时器 [文章摘要] 在实际的C程序中,一个模块执行多个操作是很常见的事情.如果多个操作同时进行,会出现程序效率低下.计算机CPU占用率过高等情况,这时就需要对所有操作的执行顺序作一个合理的安排,这就涉及到定时器的使用. 本文对C程序中的定时器的类型.设置和清除方法等作了详细的介绍,为相关开发工作的开展提供了参考. [关键词] C程序  定时器  操作  开发 一.定时器的定义及分类 我们所熟悉的定时器是一个多任务定时提醒的软件,安装于电脑或手机上.举个例子,

Linux应用程序调用其他程序执行

一.system 1.作用 在Linux应用程序中调用另一个程序: 2.用法 system("/sbin/ifconfig"): 二.popen 1.作用 调用另一个程序执行,同时保存执行的结果: 2.使用示例 #include <stdio.h> int main() { FILE *pf; char buffer[4096]; pf = popen("/sbin/ifconfig", "r"); fread(buffer, siz

在win32控制台应用程序中实现定时器

1.SetTimer:在控制台应用程序中同样可以用SetTimer实现定时器的效果. 普通的win32程序中定时器的应用很多也很方便,但是在win32控制台中也是可以使用定时器的,利用的是windows程序的消息循环机制,如下: #include<iostream> #include<windows.h> using namespace std; //定时器ID DWORD dwTimerId = 0; void CALLBACK TimeProc( HWND hwnd, UINT

Linux上从Java程序中调用C函数

原则上来说,"100%纯Java"的解决方法是最好的,但有些情况下必须使用本地方法.特别是在以下三种情况: 需要访问Java平台无法访问的系统特性和设备: 通过基准测试,发现Java代码比其他语言编写的等价代码慢得多: 其他语言编写的代码已经经过大量测试和调试,并且知道如何将其导出到所有的目标平台上. Java平台有一个用于和本地C.C++代码进行互操作的API,称为Java本地接口(JNI).下面将举例讨论Linux平台下的JNI编程. 1. 创建java类文件 创建一个native

linux中内核延时函数

第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsigned long msecs); 说明:内核函数 ndelay, udelay, 以及 mdelay 对于短延时好用, 分别延后执行指定的纳秒数, 微秒数或者毫秒数. 它们涉及到的延时常常是最多几个毫秒. 第二类延时函数原型是:(使进程进入休眠) void msleep(unsigned int

[Linux应用]Linux应用程序输出数据重定向到文件中

转自:http://blog.chinaunix.net/uid-20680966-id-4698387.html 目的是要让程序的printf的打印能重定向到某个文本中,ctrl+c强制退出后查看文本,方便调试.运行方式:a. out程序正常运行是会打印一些字符的 a.out > 1.txt 2>&1 把stdout与stderr都重定向到1.txt文件中去,结果发现运行过程中1.txt一直为空,调试发现如果a.out正常结束退出1.txt数据就正常,ctrl+c强制退出程序则1.t