您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)怎樣理解SIGALRM信號(hào),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
SIGALRM信號(hào)是操作系統(tǒng)中的其中一個(gè)信號(hào)。他的作用是設(shè)置進(jìn)程隔多久后會(huì)收到一個(gè)SIGALRM信號(hào)。下面我們看一下他的實(shí)現(xiàn)原理。
alarm系統(tǒng)調(diào)用是設(shè)置多久觸發(fā)SIGALRM信號(hào)的函數(shù)。下面是他的聲明。
#include <unistd.h>
unsigned alarm(unsigned seconds);
我們看看實(shí)現(xiàn)。
int sys_alarm(long seconds)
{
int old = current->alarm;
// 算出原來的時(shí)間
if (old)
old = (old - jiffies) / HZ;
/*
系統(tǒng)每隔n秒觸發(fā)一次時(shí)鐘中斷。jiffies是系統(tǒng)發(fā)生時(shí)鐘中斷的次數(shù)。
1秒等于HZ個(gè)jiffies,這里就是算出jiffies數(shù),即時(shí)鐘中斷發(fā)生多少次后觸發(fā)SIGALRM信號(hào)
*/
current->alarm = (seconds>0)?(jiffies+HZ*seconds):0;
// 返回舊的
return (old);
}
我們看到PCB中使用alarm字段記錄了SIGALRM信號(hào)觸發(fā)的時(shí)間。我們?cè)賮砜匆幌掠|發(fā)的時(shí)機(jī)。
*/
void schedule(void)
{
int i,next,c;
struct task_struct ** p;
// 遍歷進(jìn)程
for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
if (*p) {
/*
判斷是否設(shè)置了alarm并且過期了
alarm < jiffies說明過期了。設(shè)置alarm信號(hào),清除設(shè)置標(biāo)記
*/
if ((*p)->alarm && (*p)->alarm < jiffies) {
(*p)->signal |= (1<<(SIGALRM-1));
(*p)->alarm = 0;
}
}
...
}
在進(jìn)程調(diào)度的時(shí)候,系統(tǒng)會(huì)處理SIGALRM信號(hào)的邏輯,判斷是否可以觸發(fā)SIGALRM信號(hào)了。是的話在PCB中打上標(biāo)記。但是這時(shí)候如果該進(jìn)程沒有被調(diào)度執(zhí)行,那SIGALRM信號(hào)的函數(shù)會(huì)被延遲執(zhí)行。即這里只是記錄信息的時(shí)機(jī),不一定是執(zhí)行的時(shí)機(jī)。
另外在父進(jìn)程創(chuàng)建子進(jìn)程的時(shí)候(fork),子進(jìn)程不會(huì)進(jìn)程父進(jìn)程的alarm信息(重置為0),但是如果一個(gè)進(jìn)程設(shè)置了SIGALRM然后通過execve系列函數(shù)執(zhí)行新的程序時(shí),alarm信息會(huì)被繼承下來。最后我們看一下用法。
#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) {}
}
進(jìn)程在10秒或10秒之后觸發(fā)SIGALRM信號(hào),然后執(zhí)行信號(hào)處理函數(shù),最后退出。
關(guān)于怎樣理解SIGALRM信號(hào)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。