`
luckyclouds
  • 浏览: 111452 次
  • 性别: 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处理机制.docx

    "Linux 信号signal处理机制" 本文详细介绍了Linux信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。信号机制是进程之间相互传递消息的一种方法,信号全称为软中断...

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

    Linux信号(Signal)处理机制是操作系统提供的一种进程间通信方式,用于进程间的异步通知。在Linux编程中,理解并掌握信号机制是非常关键的。本文将深入探讨信号的基本概念、处理方法、信号类型以及相关系统调用。 ...

    linux中的signal机制

    在Linux系统中,信号(Signal)机制是一种关键的进程间通信方式,用于处理各种系统事件,如用户输入中断、程序错误、硬件异常等。信号在Linux内核与应用程序之间搭建了一个桥梁,允许操作系统向进程发送特定的信息,...

    Linux信号(signal)机制.rar

    理解并熟练掌握Linux信号机制对于进行系统级编程至关重要。 信号是操作系统向进程发送的一种消息,它可能由内核生成,也可能由另一个进程产生。当进程接收到一个信号时,它可以选择忽略该信号,或者按照预设的行为...

    linux信号机制和signal

    ### Linux信号机制与Signal详解 #### 一、信号机制的基本概念 信号是Linux操作系统中用于进程间通信的重要机制之一,其本质上是一种软中断信号。它主要用于通知进程发生了异步事件,而不涉及具体的数据传递。在...

    Linux下Signal信号.pdf

    在Linux系统中,Signal机制允许进程处理各种事件,比如用户键入Ctrl+C结束程序,或者进程收到一个不可恢复的错误需要退出等。 ### Signal信号类型 Linux支持多种信号类型,包括标准信号和实时信号。标准信号是...

    Linux信号量处理

    Linux系统中的信号量处理涉及进程间通信的一种机制,允许一个进程在执行中被中断,响应另一个进程或终端发送的信号。信号提供了一种异步的软件中断方式,使得应用程序可以在接收到特定信号时,做出相应的处理。 ...

    Linux的信号实现机制

    下面我们将深入探讨Linux信号机制的各个方面。 1. **信号定义与类型**:Linux系统定义了一系列预定义的信号,如SIGINT(中断,由Ctrl+C产生)、SIGTERM(正常终止请求)、SIGKILL(强制终止,无法被捕获或忽略)...

    Linux-signal

    ### Linux信号(signal)处理机制详解 #### 一、信号的基本概念 信号(signal),又被称为软中断信号,是一种用于进程间通信的重要机制。它允许进程在接收到特定的事件时能够采取相应的行动。信号的设计思想源自中断的...

    linux信号的机制

    ### Linux信号机制详解 #### 一、信号的基本概念 在Linux操作系统中,信号(Signal)是一种重要的进程间通信(IPC, Inter-Process Communication)机制,主要用于通知进程发生了某些类型的异常事件或状态变化。...

    Linux信号机制的分析与研究

    ### Linux信号机制的分析与研究 #### 一、引言 在现代操作系统中,Linux以其稳定性和灵活性成为了服务器领域的首选操作系统之一。其中,信号机制作为Linux内核中的一个重要组成部分,对于实现进程间的通信和异常...

    第9章linux信号与定时器

    ### 第9章Linux信号与定时器 #### 一、进程间通信与信号 在Linux操作系统中,进程间通信(IPC)是实现多个进程之间数据交换和同步的重要手段。进程间通信分为即时通信和非即时通信两种类型。其中,即时通信要求...

    Linux信号编程课件与实验代码.rar

    Linux信号编程是操作系统领域的重要组成部分,特别是在开发服务器端软件或者进行系统级编程时,理解并掌握信号机制至关重要。本资源“Linux信号编程课件与实验代码.rar”提供了一个全面学习和实践Linux信号处理的...

    Linux信号与信号处理文.pdf

    总的来说,Linux信号机制为进程间的交互提供了灵活的方式,通过设置信号处理函数,可以定制化程序对不同事件的响应。信号处理不仅可以用于进程间的通信,也可以用于内部程序控制,如异常处理、定时器等。了解和熟练...

    linux 信号使用示例

    总结来说,Linux信号机制提供了进程间通信的基础,它不仅能够帮助我们处理异常情况,还能够用于控制进程行为和协调进程间的同步。`signalWcg.c`和`signalWcgClient.c`的示例可能展示了如何创建信号处理器、发送和...

    Linux下C语言编程--信号处理函数.

    ### Linux下C语言编程——信号处理函数 #### 一、信号的基本概念与产生 在Linux系统中,**信号**是一种轻量级的进程间通信机制,用于通知接收进程某个特定事件的发生。它不仅可以由硬件异常(如除零错误)触发,也...

Global site tag (gtag.js) - Google Analytics