信号发送函数(2)

一、alarm函数

头文件:    #include <unistd.h>

函数声明:unsigned int alarm ( unsigned int seconds )

功能:设置信号SIGALRM 在经过指定的秒数(seconds) 后传送给当前进程

返回值:(每个进程只能有一个alarm维护的"闹钟")如果"闹钟"顺利超时, 则返回0;如果"闹钟"在计时过程中, 调用了另一个alarm函数, 则该"闹钟"的余留秒数作为该次alarm的返回值, 并且新的"闹钟"开始计时。(实际上是新的闹钟替代了以前的闹钟)


二、setitimer函数

头文件:     #include <sys/time.h>

函数声明:int setitimer ( int which, const struct itimerval * value, struct itimerval * ovalue );

功能:(实现精度较高的定时功能)

1)设置一段时间后,才执行某个function

2)设置每间格一段时间就执行某个function

工作机制:先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。

参数说明:

第一个参数which指定定时器类型:

(数值0)ITIMER_REAL: 以系统真实的时间来计算,它送出SIGALRM信号。
(数值1)ITIMER_VIRTUAL: 以该进程在 用户态下花费的时间来计算,它送出SIGVTALRM信号。
(数值2)ITIMER_PROF: 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
第二个参数是结构itimerval的一个实例:
struct itimerval {
struct timeval it_interval;//指定间隔时间
struct timeval it_value;    //初始定时时间
};
struct timeval {
long tv_sec; //秒级精度
long tv_usec; //微秒级精度(1/1000000s)
};
关于it_value\it_interval值设定的三种情况:
1)如果同时指定 it_interval,则超时后,系统会重新初始化it_value为it_interval,实现重复定时
2)如果只指定it_value,就是实现一次定时
3)如果两者都清零,则会清除 定时器
第三个参数ovalue用来保存先前的值,通常用不上,常设为NULL或者忽略
注:

setitimer()一个进程中只能有一个 下一个会覆盖前一个的定时 想一个进程多个定时器只能自己实现。

setitimer()不支持在同一进程中同时使用多次以支持多个定时器。

简单代码示例:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>

void signalHandler ( int signo )
{
        switch ( signo )
        {
                case SIGALRM :
                        printf( "Caught the SIGALRM signal!\n" );
                        break;
        }
}

int main ( int argc, char * argv[] )
{
        signal( SIGALRM, signalHandler );

        struct itimerval n_v;
        n_v.it_value.tv_sec = 2;
        n_v.it_value.tv_usec = 0;
        n_v.it_interval.tv_sec = 0;
        n_v.it_interval.tv_usec = 200000;

        setitimer( 0, &n_v, NULL );

        for( ;; );

        return( 0 );
}
结果分析:
延时2秒便触发一次SIGALRM信号,以后每隔0.2秒触发一次SIGALRM信号。

猜你喜欢

转载自blog.csdn.net/u013279563/article/details/49302991