前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >理解SIGALRM信号

理解SIGALRM信号

作者头像
theanarkh
发布于 2023-10-30 07:50:40
发布于 2023-10-30 07:50:40
43801
代码可运行
举报
文章被收录于专栏:原创分享原创分享
运行总次数:1
代码可运行

SIGALRM信号是操作系统中的其中一个信号。他的作用是设置进程隔多久后会收到一个SIGALRM信号。下面我们看一下他的实现原理。 alarm系统调用是设置多久触发SIGALRM信号的函数。下面是他的声明。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <unistd.h>
unsigned alarm(unsigned seconds);

我们看看实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int sys_alarm(long seconds)
{
    int old = current->alarm;
    // 算出原来的时间
    if (old)
        old = (old - jiffies) / HZ;
    /*
        系统每隔n秒触发一次时钟中断。jiffies是系统发生时钟中断的次数。
        1秒等于HZ个jiffies,这里就是算出jiffies数,即时钟中断发生多少次后触发SIGALRM信号
    */
    current->alarm = (seconds>0)?(jiffies+HZ*seconds):0;
    // 返回旧的
    return (old);
}

我们看到PCB中使用alarm字段记录了SIGALRM信号触发的时间。我们再来看一下触发的时机。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 */
void schedule(void)
{
    int i,next,c;
    struct task_struct ** p;

    // 遍历进程
    for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
        if (*p) {
            /*
                判断是否设置了alarm并且过期了
                alarm < jiffies说明过期了。设置alarm信号,清除设置标记
            */
            if ((*p)->alarm && (*p)->alarm < jiffies) {
                    (*p)->signal |= (1<<(SIGALRM-1));
                    (*p)->alarm = 0;
                }
        }
        ...
}

在进程调度的时候,系统会处理SIGALRM信号的逻辑,判断是否可以触发SIGALRM信号了。是的话在PCB中打上标记。但是这时候如果该进程没有被调度执行,那SIGALRM信号的函数会被延迟执行。即这里只是记录信息的时机,不一定是执行的时机。 另外在父进程创建子进程的时候(fork),子进程不会进程父进程的alarm信息(重置为0),但是如果一个进程设置了SIGALRM然后通过execve系列函数执行新的程序时,alarm信息会被继承下来。最后我们看一下用法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

void handle_alarm() 
{ 
    exit(0); 
} 
int main(int argc, char *argv[]) 
{ 
    signal(SIGALRM, handle_alarm); 
    alarm(10); 
    while(1) {} 
} 

进程在10秒或10秒之后触发SIGALRM信号,然后执行信号处理函数,最后退出。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
linux0.11进程调度源码分析
每个进程有一个执行的时间,每次时钟中断会减少一个单位的时间。如果时间用完则直接重新调度,否则进程可以继续执行。进程调度的时候,系统会选择时间最长的进程,防止有的进程得不到执行,当所有进程的时间片都消耗完毕,则重新计算时间。
theanarkh
2019/04/24
1.8K0
Linux信号种类与函数
要对一个信号进行处理(除了无法捕捉的SIGKILL和SIGSTOP),需要为其注册相应的处理函数,通过调用signal()函数可以进行注册。
xxpcb
2020/08/04
3.1K0
nginx之SIGALRM和SIGCHID信号
在进行堵塞式系统调用时。为避免进程陷入无限期的等待,能够为这些堵塞式系统调用设置定时器。Linux提供了alarm系统调用和SIGALRM信号实现这个功能。
随心助手
2019/10/15
1.4K0
【Linux课程学习】:第二十一弹---深入理解信号(中断,信号,kill,abort,raise,larm函数)
每一个硬件都有自己的中断请求号(IRQ),所以以后的中断就能区分是哪个硬件发来的,就可以让CPU去哪个硬件读取数据。
用户11396661
2024/12/18
1840
【Linux课程学习】:第二十一弹---深入理解信号(中断,信号,kill,abort,raise,larm函数)
linux系统编程之信号(二):一些信号发送函数和不同精度的睡眠
一、kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp,
s1mba
2017/12/26
1.3K0
Linux内核编程--进程通信信号
信号是 Linux 进程间通信的最古老的方式。信号是软件中断,它是在软件层次上对中断机制的一种模拟。
Coder-ZZ
2022/05/09
3K0
Linux内核编程--进程通信信号
Linux下的signal信号机制
在Linux中,要发送一个信号相当容易。程序员需要知道两个信息:要发送哪个信号,将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用的信号的列表。用户可以只将信号发送给用户自己的进程,也可以以root身份运行从而将信号发送给任意一进程。
阳光岛主
2019/02/20
4.1K0
linux系统的进程管理
本文讲解系统的进程管理相关内容,系统的进程管理是有关系统的所有进程的调度、排序、分配资源、创建、销毁等,是比较重要的内容。
Gnep@97
2024/03/07
2540
linux系统的进程管理
[操作系统] 信号
在我们正式开始学习操作系统中的“信号”(Signal)之前,有几个概念需要先厘清:
DevKevin
2025/05/30
500
[操作系统] 信号
【Linux】:进程信号(信号概念 & 信号处理 & 信号产生)
🚀 信号是 Linux 系统提供的一种向指定进程发送特定事件的方式,进程会对信号进行识别和处理。
IsLand1314
2024/11/19
4290
【Linux】:进程信号(信号概念 & 信号处理 & 信号产生)
Linux系统-进程信号
注:阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作
用户9645905
2022/11/15
3.6K0
Linux系统-进程信号
【Linux进程#4】:进程信号(信号概念 & 信号处理 & 信号产生)
✨ 眼里有诗,自向远方 🌏
IsLand1314
2025/06/02
1180
【Linux进程#4】:进程信号(信号概念 & 信号处理 & 信号产生)
【Linux】详解信号产生的方式
在命令行中通过kill -数字 pid指令可以给指定进程发送指定信号。这里说明一下几个常见的信号:
用户10923276
2024/05/03
2250
【Linux】详解信号产生的方式
【Linux篇】理解信号:如何通过信号让程序听从操作系统的指令
信号的产生是现代通信系统中的基础,它涉及将信息从一个地方传递到另一个地方。在通信过程中,信号扮演着至关重要的角色,它是信息的载体。信号的生成可以通过不同的方式实现,包括电磁波的调制、音频信号的转换等。理解信号的产生过程有助于我们掌握如何高效地传递信息。在此基础上,我们能够进一步探讨信号的处理与优化,确保信息能够准确、迅速地到达目的地。
熬夜学编程的小王
2025/04/27
1170
【Linux篇】理解信号:如何通过信号让程序听从操作系统的指令
【linux学习指南】Linux进程信号产生(二)软件中断
SIGPIPE 是⼀种由软件条件产⽣的信号,在“管道”中已经介绍过了。本节主要介绍和SIGALRM 信号。
学习起来吧
2024/11/30
1460
【linux学习指南】Linux进程信号产生(二)软件中断
【Linux信号】一:信号的概念、信号的产生
信号在生活中随处可见,比如体育比赛中使用的信号枪、我给你传递一个眼神(你懂的哈哈哈),等等。这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。
mindtechnist
2024/08/08
3490
【Linux信号】一:信号的概念、信号的产生
Linux进程信号【信号产生】
在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用
北 海
2023/07/01
6890
Linux进程信号【信号产生】
Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)
上次结束了进程间通信的知识介绍:Linux:进程间通信(二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量
是Nero哦
2024/07/25
3420
Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)
Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系。
二肥是只大懒蓝猫
2023/03/30
1.4K0
Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
Linux进程信号总结
不难看出上面的死循环在代码层面是永远无法结束程序的,那是否还有别的办法?对于死循环来说,最好的方式就是使用Ctrl+C对其进行终止。
咬咬
2024/07/20
1350
Linux进程信号总结
推荐阅读
相关推荐
linux0.11进程调度源码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验