91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎樣理解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

乐业县| 城口县| 固阳县| 宁都县| 农安县| 名山县| 曲麻莱县| 隆德县| 松江区| 科尔| 兰西县| 资中县| 泽库县| 舒城县| 灵山县| 西安市| 繁峙县| 衢州市| 五莲县| 四会市| 峨眉山市| 旬阳县| 磴口县| 西丰县| 临安市| 正镶白旗| 亳州市| 常熟市| 天镇县| 香河县| 宜都市| 叶城县| 汉阴县| 香格里拉县| 温州市| 社旗县| 漳浦县| 邢台县| 高碑店市| 通化市| 邵武市|