alarm()函数的使用总结
alarm()函数说明
1.引用头文件:#include <unistd.h>;
2.函数标准式:unsigned int alarm(unsigned int seconds);
3.功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。
4.函数返回值:如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回。
alarm()测试1.1
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h> void sig_handler(int num)
{
printf("receive the signal %d.\n", num);
} int main()
{
signal(SIGALRM, sig_handler); //SIGALRM是在定时器终止时发送给进程的信号
alarm(2);
pause();//pause()函数使该进程暂停让出CPU
exit(0);
}
运行结果:两秒钟后输出

如果我们想程序每2秒都定时一下,这样实现也很简单,我们在处理定时信号的函数中再次定时2秒;实例如下:
#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h> void sig_handler(int num)
{
printf("receive the signal %d.\n", num);
alarm(2);
} int main()
{
signal(SIGALRM, sig_handler);
alarm(2);
while(1)//做一个死循环,防止主线程提早退出,相等于线程中的join
{
pause();
}
//pause();//如果没有做一个死循环则只会让出一次cpu然后就还给主线程,主线程一旦运行结束就会退出程序
exit(0);
}
运行结果:每隔2秒钟就会输出一次。

可以看出程序每隔2秒就会收到信号14,也就是SIGALRM信号;并且当处理完该信号之后,直接执行pause()函数下面的语句;说明pause()是可被中断的暂停;



备注:这样就可以使用alarm函数来实现server和client之间的定时通信,比如说我想在一个小时后发送xxx给xxx
alarm()函数的使用总结的更多相关文章
- 三十一、Linux 进程与信号——SIGCHLD 信号、kill和raise函数以及alarm函数
31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它. 避免僵尸进程 #include <stdio.h> # ...
- linux C之alarm函数 转
原文出处:http://blog.sina.com.cn/s/blog_6a1837e90100uhl3.html alarm也称为闹钟函数,alarm()用来设置信号SIGALRM在经过参数seco ...
- alarm函数
alarm函数 设置定时器(闹钟).在指定seconds后,内核会给当前进程发送14)SIGALRM信号.进程收到该信号,默认动作终止. 每个进程都有且只有唯一个定时器. unsigned int a ...
- linux alarm函数解除read write等函数的阻塞
看到apue的第十章,说到alarm,pause可以实现sleep,可以让某些一直阻塞的函数超时,例如read,write.代码如下: static void sig_alrm(int signo) ...
- 关于alarm函数
#include<unistd.h> #include<signal.h> void handler() { printf("Hello\n"); sign ...
- alarm函数可以定时
貌似是可以的,不过感觉好像这样用不是很好,最好还是用回timer_settimer一些列函数吧,不过既然开了头,就看下alarm怎么用吧. 1. 所需头文件 #include<unistd.h ...
- linux中alarm函数和pause函数详解实例
alarm(time);执行之后告诉内核,让内核在time秒时间之后向该进程发送一个定时信号,然后该进程捕获该信号并处理:pause()函数使该进程暂停让出CPU,但是该函数的暂停和前面的那个slee ...
- 信号之alarm和pause函数
使用alarm函数可以设置一个计时器,在将来某个指定的时间,该计时器会超时.当计时器超时时,产生SIGALRM信号.如果不忽略或不捕捉此信号,则其默认动作是终止调用该alarm函数的进程. #incl ...
- UNIX环境高级编程——信号之kill、raise、killpg、alarm、pause、abort、sleep、usleep、nanosleep和setitimer函数
一.kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int ...
随机推荐
- 使用mybatis动态where字句方法
上篇文章介绍了如何使用mybatis-generator生成实体类.Mapper接口代码,其中生成的Mapper接口代码是不带ByExample方法的.本篇文章将介绍如何使用mybatis-gener ...
- Ubuntu上的apt/apt-get等命令的实质意义和区别
Ubuntu上的apt/apt-get等命令的实质意义和区别 一.前言 在使用apt和apt-get命令的时候我们常常会疑惑这两者有什么区别,因为大多数时间这两个命令能做很多相同的事情. 二.APT/ ...
- 【shell脚本】不停地telnet一个ip或域名,并输出结果到文件中===telnetscript.sh
编写shell脚本不停地telnet一个域名,并输出结果到文件中 [root@localhost ~]# cat telnetscript.sh #!/bin/bash #检查是否在root用户下执行 ...
- C++:Overload
重载 函数签名是指函数的参数个数,参数类型以及参数的顺序.重载的定义是:在同一作用域内函数签名不同但函数名相同的函数互为重载. // 以下几个函数互为重载 void print(); void pri ...
- matplotlib画图相关
一. plt显示一副图像 1. import matplotlib.pyplot as plt 2. plt.figure() # 图像名称 3. plt.ims ...
- Spring源码系列 — 容器Extend Point(一)
前言 前文介绍了Spring中的BeanDefinition的细节,随着Spring的启动流程,这节我们介绍Spring的后续处理过程 - Spring的扩展点: BeanFactoryPostPro ...
- Vue动态修改网页标题
业务需求,进入页面的时候,网页有个默认标题,加载的网页内容不同时,标题需要变更. 例:功能授权,功能授权(张三). Vue下有很多的方式去修改网页标题,这里总结下解决此问题的几种方案: 一.最笨方案 ...
- .NET Core 使用NPOI读取Excel返回泛型List集合
我是一名 ASP.NET 程序员,专注于 B/S 项目开发.累计文章阅读量超过一千万,我的博客主页地址:https://www.itsvse.com/blog_xzz.html 网上有很多关于npoi ...
- hashmap与hashtable的本质区别
HashMap 底层数据结构是哈希表.线程不安全,效率高 哈希表依赖两个方法:hashCode()和equals() 执行顺序: ...
- 【maven】测试
针对spring-boot项目 通过命令行执行mvn命令来启动测试模块. 1.引入plugin 并自定义参数ignore.test 2.命令行传递参数启动test mvn clean package ...