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

理解SIGALRM信号

作者头像
theanarkh
发布2023-10-30 15:50:40
2400
发布2023-10-30 15:50:40
举报
文章被收录于专栏:原创分享原创分享

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

代码语言:javascript
复制
#include <unistd.h>
unsigned alarm(unsigned seconds);

我们看看实现。

代码语言:javascript
复制
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
复制
 */
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
复制
#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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档