#1、alarm函数
(1) 头文件:#include <unistd.h>;
(2)函数原型:unsigned int alarm(unsigned int seconds);
(3)功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。
(4)函数返回值:如果在sec秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数sec为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回。
#2、环境
我自己使用的是Ubuntu16.04,大家测试的时候可能环境不一样,可能出现的问题也不一样,大家自己到时候斟酌。
#3、测试
##3.1主要测试是单独使用一个alarm()函数和调用一个以上的alarm()函数会有什么不同的结果
测试1:
/*====================================================
* Copyright (C) 2020 All rights reserved.
*
* 文件名称:alarm.c
* 创 建 者:
* 创建日期:2020年08月31日
* 描 述:
================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signum)
{
printf("Receive signal!\n");
}
int main(int argc, char *argv[])
{
signal(SIGALRM,sig_handler);
alarm(5);
sleep(10);
printf("Welcome come main()!\n");
return 0;
}
程序分析:在文件alarm.c中,定义了一个时钟alarm(5),它的作用是让信号SIGALRM在经过5秒后传送给目前main()所在进程;接着又定义了sleep(10),它的作用是让执行挂起10秒的时间。所以当main()程序挂起10秒钟时,signal函数调用SIGALRM信号的处理函数sig_handler,并且sig_handler
打印结果:
测试2:
多个alarm()函数共同调用时,后面设置的时钟会覆盖掉前面的时钟,
/*====================================================
* Copyright (C) 2020 All rights reserved.
*
* 文件名称:alarm_1.c
* 创 建 者:
* 创建日期:2020年08月31日
* 描 述:
================================================================*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i;
alarm(10);
alarm(1);
alarm(5);
for (i = 0; i < 7; i++)
{
printf("sleep--------> %d\n",i);
sleep(1);
}
return 0;
}
运行结果:
测试3:
/*====================================================
* Copyright (C) 2020 All rights reserved.
*
* 文件名称:alarm_2.c
* 创 建 者:
* 创建日期:2020年09月01日
* 描 述:
================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
static void sig_alarm(int signum);
int main(int argc, char *argv[])
{
signal(SIGALRM,sig_alarm);
puts("Begin!");
alarm(7);
sleep(5);
printf("date is %d\n",alarm(5));
pause();
//return 0;
}
static void sig_alarm(int signum)
{
puts("End!");
return;
}
运行结果:
最后程序会打印出之前设置时钟所剩下的时间,所以真个程序执行了5+5 = 10 秒,然后系统执行alarm(5)进入到函数,然后执行程序,pause()函数在这里不往下执行,挂起,等待一个信号的到来。然后alarm(5)信号触发,程序正常结束。
test4:
/*====================================================
* Copyright (C) 2020 All rights reserved.
*
* 文件名称:alarm_2.c
* 创 建 者:lzz 1822018055@qq.com
* 创建日期:2020年09月01日
* 描 述:
================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
static void sig_alarm(int signum);
int main(int argc, char *argv[])
{
signal(SIGALRM,sig_alarm);
puts("Begin!");
alarm(7);
sleep(5);
printf("date is %d\n",alarm(0));
pause();
//return 0;
}
static void sig_alarm(int signum)
{
puts("End!");
return;
}
运行结果:
值得注意:这里alarm(5)修改为alarm(0),程序没有正常往下执行,并返回上一次剩下的时间2,alarm(0) 是会一直卡住不会往下执行,因为没有任何信号触发,pause一直挂起等待一个信号的到来。