`
luckyclouds
  • 浏览: 108964 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Linux 信号signal处理机制 四

阅读更多
4、alarm和 setitimer系统调用

        系统调用alarm的功能是设置一个定时器,当定时器计时到达时,将发出一个信号给进程。该调用的声明格式如下:
        unsigned int alarm(unsigned int seconds);
        在使用该调用的进程中加入以下头文件:
        #include <unistd.h>

        系 统调用alarm安排内核为调用进程在指定的seconds秒后发出一个SIGALRM的信号。如果指定的参数seconds为0,则不再发送 SIGALRM信号。后一次设定将取消前一次的设定。该调用返回值为上次定时调用到发送之间剩余的时间,或者因为没有前一次定时调用而返回0。

        注意,在使用时,alarm只设定为发送一次信号,如果要多次发送,就要多次使用alarm调用。

        对于alarm,这里不再举例。现在的系统中很多程序不再使用alarm调用,而是使用setitimer调用来设置定时器,用getitimer来得到定时器的状态,这两个调用的声明格式如下:
        int getitimer(int which, struct itimerval *value);
        int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
        在使用这两个调用的进程中加入以下头文件:
        #include <sys/time.h>

        该系统调用给进程提供了三个定时器,它们各自有其独有的计时域,当其中任何一个到达,就发送一个相应的信号给进程,并使得计时器重新开始。三个计时器由参数which指定,如下所示:
        TIMER_REAL:按实际时间计时,计时到达将给进程发送SIGALRM信号。
        ITIMER_VIRTUAL:仅当进程执行时才进行计时。计时到达将发送SIGVTALRM信号给进程。
        ITIMER_PROF:当进程执行时和系统为该进程执行动作时都计时。与ITIMER_VIR-TUAL是一对,该定时器经常用来统计进程在用户态和内核态花费的时间。计时到达将发送SIGPROF信号给进程。

        定时器中的参数value用来指明定时器的时间,其结构如下:
        struct itimerval {
        struct tim it_interval; /* 下一次的取值 */
        struct tim it_value; /* 本次的设定值 */
        };

        该结构中tim结构定义如下:
        struct tim {
        long tv_sec; /* 秒 */
        long tv_usec; /* 微秒,1秒 = 1000000 微秒*/
        };

        在setitimer 调用中,参数ovalue如果不为空,则其中保留的是上次调用设定的值。定时器将it_value递减到0时,产生一个信号,并将it_value的值设 定为it_interval的值,然后重新开始计时,如此往复。当it_value设定为0时,计时器停止,或者当它计时到期,而it_interval 为0时停止。调用成功时,返回0;错误时,返回-1,并设置相应的错误代码errno:
        EFAULT:参数value或ovalue是无效的指针。
        EINVAL:参数which不是ITIMER_REAL、ITIMER_VIRT或ITIMER_PROF中的一个。

        下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号:
         #include <signal.h>
        #include <unistd.h>
        #include <stdio.h>
        #include <sys/time.h>
        int sec;

        void sigroutine(int signo) {
        switch (signo) {
        case SIGALRM:
        printf("Catch a signal -- SIGALRM ");
        break;
        case SIGVTALRM:
        printf("Catch a signal -- SIGVTALRM ");
        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 信号signal处理机制

    Linux 信号signal处理机制,Linux 信号signal处理机制

    Linux 信号signal处理机制.docx

    Linux 信号signal处理机制.docx

    Linux信号signal处理机制[参考].pdf

    Linux信号signal处理机制[参考].pdf

    linux信号机制和signal

    信号是Linux编程中非常重要部分本文将详细介绍信号机制基本概念、Linux对信号机制大致实现思路方法、如 何使用信号以及有关信号几个系统

    Linux信号(signal)机制.rar

    Linux,系统,内幕,编程

    linux进程间通信——信号机制

    对linux信号机制的详细阐述,包括signal,sigaction等函数的用法,并配以实例,通俗易懂,适合初学者阅读。。。

    深入分析Linux内核源码.chm

    7.2 信号(signal) 7.3 System V 的IPC机制 第八章 虚拟文件系统 8.1 概述 8.2 VFS中的数据结构 8.3 高速缓存 8.4 文件系统的注册、安装与拆卸 8.5 限额机制 8.6 具体文件系统举例 8.7 文件系统的系统调用 8 .8 Linux...

    信号量机制实验

    编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号...

    3操作系统实验.doc

    实验一:信号机制 实验目的 1、了解什么是信号 2、熟悉LINUX系统中进程之间软中断通信的基本原理 实验内容 1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键...

    LINUX环境高级编程 第五章 信号

    信号的概念 signal函数 不可靠信号与可靠信号 信号的发送接收机制 信号集与可靠信号机制 sigsetjmp和siglongjmp函数 abort函数

    Linux内核中的信号机制??信号处理

    当进程被调度时,会调用do_notify_resume()来处理信号队列中的信号。信号处理主要是调用sighand_struct结构中对应的信号处理函数。do_notify_resume()(arch/arm/kernel/signal.c)函数的定义如下: asmlinkage void...

    Linux内核中的信号机制??信号发送

    应用程序发送信号时,主要通过kill进行。注意:不要被“kill”迷惑,它并不是发送SIGKILL信号专用函数。这个函数主要通过系统调用sys_kill()进入内核,它接收两个参数:  第一个参数为目标进程id,kill()可以向...

    操作系统实验报告4-Linux软中断通信

    ①:了解linux软中断(Signal)的工作原理②:在Linux上使用C语言编写一个包含信号处理机制的程序,该程序中可以安装自己的信号处理程序;再此基础上发送一个对应的信号,验证自己安装的信号处理程序

    深入分析Linux内核源码

    7.2 信号(signal) 7.2.1 信号种类 7.2.2 信号掩码 7.2.3 系统调用 7.2.4 典型系统调用的实现 7.2.5 进程与信号的关系 7.2.6 信号举例 7.3 System V 的IPC机制 7.3.1 信号量 7.3.2 消息队列 7.3.3 共享内存...

    QT的信号与槽机制介绍

    信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念、元对象工具以及在实际使用过程中应注意的一些问题。 QT是一个跨平台的C GUI应用构架,它提供了丰富的窗口部件集,具有面向...

    Linux高性能服务器编程

    10.1.3 Linux信号 10.1.4 中断系统调用 10.2 信号函数 10.2.1 signal系统调用 10.2.2 sigaction系统调用 10.3 信号集 10.3.1 信号集函数 10.3.2 进程信号掩码 10.3.3 被挂起的信号 10.4 统一事件源 10.5 ...

    linux下几种最常用的IPC接口,这样一来,统一了接口,提高代码重用性.rar

    linux除了支持Unix早期信号语义函数signal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);...

    Linux内核中的信号机制–从用户层到内核层

    注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作。主要有两个函数实现信号的注册:signal()和sigaction()。  2、signal() ...

Global site tag (gtag.js) - Google Analytics