linux下alarm函数基本用法

#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一直挂起等待一个信号的到来。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux中的定时器alarm是一个系统调用,用于设置一个定时器,当定时器到期时,内核会发送一个信号给进程。 使用alarm函数可以设置一个相对时间(以秒为单位)作为定时器的超时时间。该函数的原型为: ```c unsigned int alarm(unsigned int seconds); ``` 参数seconds指定了定时器的超时时间,返回值为上一次设置的定时器的剩余时间(如果有的话),如果没有上一次设置的定时器,则返回0。 当超时时间到达时,内核会向进程发送一个SIGALRM信号。我们可以通过注册信号处理函数来捕获该信号,并在信号处理函数中执行相应的操作。 下面是一个简单的示例程序,演示了如何使用alarm函数设置定时器并捕获SIGALRM信号: ```c #include <stdio.h> #include <unistd.h> #include <signal.h> void handle_alarm(int signum) { printf("Alarm received.\n"); } int main() { signal(SIGALRM, handle_alarm); // 注册信号处理函数 unsigned int remaining_time = alarm(5); // 设置定时器为5秒 printf("Remaining time: %u seconds.\n", remaining_time); sleep(10); // 休眠10秒,等待定时器超时 return 0; } ``` 在上面的示例中,首先我们使用signal函数注册了一个SIGALRM信号的处理函数handle_alarm。然后调用alarm函数设置了一个5秒的定时器,并将返回值打印出来。最后使用sleep函数休眠10秒,等待定时器超时。当定时器超时时,handle_alarm函数会被调用,并打印出"Alarm received."的提示信息。 这就是使用alarm函数设置定时器的基本步骤。你可以根据具体的需求来灵活使用定时器功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值