中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣理解SIGALRM信號

發布時間:2021-12-09 09:25:15 來源:億速云 閱讀:261 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關怎樣理解SIGALRM信號,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

SIGALRM信號是操作系統中的其中一個信號。他的作用是設置進程隔多久后會收到一個SIGALRM信號。下面我們看一下他的實現原理。
    alarm系統調用是設置多久觸發SIGALRM信號的函數。下面是他的聲明。

#include <unistd.h>
unsigned alarm(unsigned seconds);
 

我們看看實現。

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信號觸發的時間。我們再來看一下觸發的時機。

 */
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信息會被繼承下來。最后我們看一下用法。

#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信號,然后執行信號處理函數,最后退出。

關于怎樣理解SIGALRM信號就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

天祝| 四子王旗| 佳木斯市| 闻喜县| 黄冈市| 郁南县| 扎赉特旗| 吉安市| 大石桥市| 青河县| 茶陵县| 丹东市| 威远县| 浙江省| 大荔县| 屏南县| 德格县| 隆尧县| 明溪县| 百色市| 同仁县| 关岭| 通榆县| 达尔| 吉林市| 肃南| 浏阳市| 通山县| 贵定县| 中方县| 德清县| 黎城县| 延川县| 抚州市| 兴安盟| 澄城县| 台州市| 瑞丽市| 太和县| 格尔木市| 南丰县|