← 返回首页
Linux高级程序设计(三十八)
发表时间:2021-11-22 22:25:32
alarm函数

alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。

1.alarm函数

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

返回值:若前面没有设置定时器或者设置的定时器已经超时返回0,否则返回上一个定时器剩余的秒数,并重新设定定时器。

实例: alarm()默认处理为终止进程。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char *argv[])
{
    alarm(5);
    while (1)
    {
        printf("this is main()\n");
        sleep(1);
    }
    return 0;
}

运行结果:

[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
this is main()
this is main()
this is main()
this is main()
this is main()
Alarm clock

我们也可以自定义alarm处理行为。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void sig_handler(int signum)
{
    printf("Receive a signal!\n");
}

int main(int argc, char *argv[])
{
    signal(SIGALRM,sig_handler);
    alarm(5);
    while (1)
    {
        printf("this is main()\n");
        sleep(1);
    }
    return 0;
}

运行结果:

[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
this is main()
this is main()
this is main()
this is main()
this is main()
Receive a signal!
this is main()
...

实例: 第二个定时器会覆盖第一个定时器。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char *argv[])
{
    unsigned int sec;
    sec = alarm(5);
    printf("sec=%d\n",sec);
    sleep(3);
    sec = alarm(6); //6秒后进程结束
    printf("sec=%d\n",sec); //上个定时器还剩下2秒

    while (1)
    {
        printf("this is main()\n");
        sleep(1);
    }
    return 0;
}

运行结果:

[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
sec=0
sec=2
this is main()
this is main()
this is main()
this is main()
this is main()
this is main()
Alarm clock