日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
LinuxC下信號(hào)屏蔽:保障穩(wěn)定運(yùn)行的重要手段(linuxc信號(hào)屏蔽)

在 Linux C 程序開(kāi)發(fā)的過(guò)程中,信號(hào)的處理是一個(gè)非常重要的話題。信號(hào)的正確處理能夠保證程序的正常運(yùn)行,也能幫助開(kāi)發(fā)者找出程序中的一些潛在問(wèn)題。在信號(hào)處理中,信號(hào)屏蔽是一個(gè)非常重要的概念。它能夠保護(hù)程序在信號(hào)處理期間不被打斷,從而保證程序的穩(wěn)定運(yùn)行。

大姚網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),大姚網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為大姚超過(guò)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的大姚做網(wǎng)站的公司定做!

一、信號(hào)的基本概念

在 Linux 系統(tǒng)中,信號(hào)是進(jìn)程之間通信的一種手段。當(dāng)一個(gè)進(jìn)程需要通知另一個(gè)進(jìn)程某個(gè)事件已經(jīng)發(fā)生時(shí),就可以通過(guò)發(fā)送信號(hào)的方式來(lái)通知。另外,信號(hào)也是操作系統(tǒng)向進(jìn)程通知系統(tǒng)事件的一種方式。

當(dāng)一個(gè)進(jìn)程收到一個(gè)信號(hào)時(shí),它需要對(duì)該信號(hào)進(jìn)行處理。通常,進(jìn)程可以選擇忽略該信號(hào),使用默認(rèn)方式處理該信號(hào),或者將信號(hào)交給處理程序進(jìn)行處理。處理程序需要在接收到信號(hào)時(shí)執(zhí)行一些指定的操作,例如關(guān)閉文件,釋放資源等。

在 Linux C 中,信號(hào)可以通過(guò)調(diào)用 signal() 系列函數(shù)來(lái)設(shè)置。例如,可以通過(guò)下面的代碼將 SIGINT 信號(hào)指向處理函數(shù):

“`

#include

void handler(int sig)

{

printf(“Received signal %d\n”, sig);

}

int mn()

{

signal(SIGINT, handler);

printf(“Press Ctrl+C to send SIGINT signal\n”);

while(1);

return 0;

}

“`

該程序設(shè)置了 SIGINT 的處理程序?yàn)?handler() 函數(shù)。當(dāng)程序運(yùn)行時(shí),如果用戶按下 Ctrl+C,就會(huì)發(fā)送一個(gè) SIGINT 信號(hào),程序?qū)?huì)執(zhí)行 handler() 函數(shù)。

二、信號(hào)的屏蔽

在信號(hào)處理期間,有些信號(hào)可能會(huì)中斷當(dāng)前任務(wù)的執(zhí)行。為了確保程序的穩(wěn)定運(yùn)行,我們需要將一些信號(hào)屏蔽掉,這將會(huì)使它們?cè)谛盘?hào)處理期間不會(huì)打斷當(dāng)前任務(wù)的執(zhí)行。

在 Linux C 中,通過(guò) sigprocmask() 函數(shù)來(lái)設(shè)置信號(hào)屏蔽。該函數(shù)的原型為:

“`

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

“`

該函數(shù)有三個(gè)參數(shù):

1. how:表示信號(hào)屏蔽方式,可以是以下三種取值:

– SIG_BLOCK:將 set 指向信號(hào)集中的信號(hào)添加到進(jìn)程的信號(hào)屏蔽字中;

– SIG_UNBLOCK:將 set 指向信號(hào)集中的信號(hào)從進(jìn)程的信號(hào)屏蔽字中刪除;

– SIG_SETMASK:用 set 指向信號(hào)集中的信號(hào)替換進(jìn)程的信號(hào)屏蔽字;

2. set:指向要設(shè)置的信號(hào);

3. oldset:用來(lái)保存之前屏蔽的信號(hào)的。

該函數(shù)的具體用法可以參考下面的例子:

“`

#include

int mn()

{

sigset_t mask;

sigemptyset(&mask);

sigaddset(&mask, SIGINT);

sigprocmask(SIG_BLOCK, &mask, NULL);

printf(“SIGINT signal is blocked.\n”);

while (1);

return 0;

}

“`

該程序?qū)⑵帘?SIGINT 信號(hào)。運(yùn)行該程序后,按下 Ctrl+C 并不會(huì)觸發(fā) SIGINT 信號(hào)的處理,因?yàn)樵撔盘?hào)已經(jīng)被屏蔽了。

三、信號(hào)的處理函數(shù)中的信號(hào)屏蔽

在信號(hào)處理函數(shù)中,除了需要對(duì)信號(hào)進(jìn)行處理外,還需要考慮信號(hào)的屏蔽問(wèn)題。一些信號(hào),在信號(hào)處理期間可能會(huì)被再次觸發(fā)。如果在信號(hào)處理函數(shù)中沒(méi)有進(jìn)行信號(hào)屏蔽,就可能會(huì)導(dǎo)致棧溢出和無(wú)限循環(huán)等問(wèn)題。

解決該問(wèn)題的方法是在信號(hào)處理函數(shù)的開(kāi)頭對(duì)信號(hào)進(jìn)行屏蔽操作,在函數(shù)結(jié)束時(shí)取消屏蔽。這個(gè)過(guò)程可以通過(guò) sigaction() 函數(shù)中的 sa_mask 字段來(lái)實(shí)現(xiàn)。例如:

“`

#include

void handler(int sig)

{

sigset_t mask;

sigemptyset(&mask);

sigaddset(&mask, sig);

sigprocmask(SIG_BLOCK, &mask, NULL);

printf(“Received signal %d\n”, sig);

sigprocmask(SIG_UNBLOCK, &mask, NULL);

}

int mn()

{

struct sigaction sa;

sigemptyset(&sa.sa_mask);

sigaddset(&sa.sa_mask, SIGINT);

sa.sa_flags = 0;

sa.sa_handler = handler;

sigaction(SIGINT, &sa, NULL);

while(1);

return 0;

}

“`

該程序中,handler() 函數(shù)在開(kāi)頭將 SIGINT 信號(hào)屏蔽,然后進(jìn)行信號(hào)處理,最后再將 SIGINT 信號(hào)取消屏蔽。這樣就可以保證在信號(hào)處理中不會(huì)再次收到該信號(hào)。

四、

相關(guān)問(wèn)題拓展閱讀:

  • linux 內(nèi)核中斷 用什么鎖
  • LINUX軟中斷通信

linux 內(nèi)核中斷 用什么鎖

首先我闡明一下,用鎖的情況只有兩種:

線程

文件

內(nèi)核程序在使用的時(shí)候也脫離不了這兩種鎖的概念。

中斷,是信號(hào),是否要處理中斷信號(hào)喚茄?或者產(chǎn)生中斷信號(hào)仔核?

對(duì)信號(hào)來(lái)說(shuō)只有:

信號(hào)屏蔽、信號(hào)捕捉、信號(hào)排隊(duì)、可重如函數(shù)等概念。

你想問(wèn)的念鏈掘問(wèn)題,我沒(méi)猜測(cè),在處理某個(gè)信號(hào)時(shí),不想讓其他信號(hào)中斷,那么使用信號(hào)屏蔽字:

先設(shè)置要屏蔽的信號(hào)集,要保存的信號(hào)集,初始信號(hào)集,可供協(xié)調(diào)使用的函數(shù)有幾個(gè):

#include

signal(這個(gè)不建議使用,應(yīng)為有些老的實(shí)現(xiàn)是有問(wèn)題的),設(shè)置信號(hào)處理程序

sig_atomic_t 數(shù)據(jù)類型

sigprocmask,設(shè)置信號(hào)屏蔽字

sigaction,設(shè)置信號(hào)處理程序,功能跟強(qiáng)悍,可控性更好

sigsuspend,以原子性方式,等待某些信號(hào)發(fā)生,然后返回

你具體要做啥不清楚,但使用上面的信號(hào)相關(guān)的函數(shù),肯定能實(shí)現(xiàn)你的功能。參考APUE的論述。

LINUX軟中斷通信

我驗(yàn)證下阿…一不小心就fork多了..

剛開(kāi)始我把kill的參數(shù)弄反了,信號(hào)和pid位置弄錯(cuò)了,調(diào)了半個(gè)小時(shí),很郁悶..

你只是忽略了一點(diǎn)…,我也給忽略了。。。后來(lái)才想起來(lái)

你按下ctrl+C的時(shí)候,另外兩個(gè)fork出來(lái)的進(jìn)程,他們也會(huì)接到SIGINT。伍搭橡。。就退出了。。所以你要先在子進(jìn)程里面忽略這個(gè)SIGINT信號(hào),用枝或signal(SIGINT,SIG_IGN)就OK了….

程序如下…

有解釋,你可以自己看腔旁看…

#include”stdio.h”

#include”unistd.h”

#include”signal.h”

#include”sys/types.h”

#include”stdlib.h”

int k=0;

pid_t child1=0,child2=0;

void func_main(int sig);

void func_child1(int sig);

void func_child2(int sig);

int main()

{

while((child1=fork())==-1);

if(child1==0)

{

printf(“child1 OK\n”);

signal(SIGINT,SIG_IGN);

signal(SIGUSR1,func_child1);

sleep(60);

}

else if(child1 >0)

{

while((child2=fork())==-1);

if(child2==0)

{

printf(“child 2 OK\n”);

signal(SIGINT,SIG_IGN);//你按下ctrl+C,子進(jìn)程也會(huì)接受到ctrl的信號(hào)…所以,子進(jìn)程忽略

//所提子進(jìn)程要忽略掉這個(gè)SIGINT信號(hào)

signal(SIGUSR2,func_child2);

sleep(60); //這里為了驗(yàn)證,如果進(jìn)程沒(méi)退出,40妙之后自動(dòng)會(huì)退出的

//不然就得手動(dòng)在終端里面kill掉這個(gè)進(jìn)程了…

//有時(shí)候成了僵尸進(jìn)程需要kill -9 才能殺死

}

else if(child2 >0)

{

signal(SIGINT,func_main);

printf(“children forked OK…\n”);

wait(0);

printf(“child return…\n”);

sleep(100);

return 0;

}

}

}

void func_main(int sig)

{

k++;

printf(“to send signal\n”);

//printf(“child1=%d,child2=%d\n”,child1,child2);

//if(k==1)

kill(child1,SIGUSR1);

//if(k==2)加上這句,再按一次ctrl C,子進(jìn)程2才會(huì)退出

就是你想要的效果了

kill(child2,SIGUSR2);

signal(SIGINT,SIG_DFL); //這里恢復(fù)ctrl+C的效果

//子進(jìn)程退出之后,我們?cè)侔匆淮蝐trl+C,當(dāng)前的父進(jìn)程就會(huì)像平常一樣,退出。

}

void func_child1(int sig)

{

printf(“child1 is killed by parent!\n”);

exit(0);

}

void func_child2(int sig)

{

printf(“child2 is killed by parent!\n”);

exit(0);

}

我也是初學(xué)者,這里抄一段《Linux設(shè)備驅(qū)動(dòng)程序》書上的給你:

Linux的中斷宏觀分為兩種:軟中斷和硬中斷。聲明一橘啟數(shù)下,這里的軟和硬的意思是指和軟件相關(guān)以及和硬件相關(guān),而不是軟件實(shí)現(xiàn)的中斷或硬件實(shí)現(xiàn)的中斷。軟中斷就是“信號(hào)機(jī)制”。軟中斷不是軟件中斷。Linux通過(guò)信號(hào)來(lái)產(chǎn)生對(duì)進(jìn)程的各種中斷操作,我們現(xiàn)在知道的信號(hào)共有31個(gè),其具體內(nèi)容這里略過(guò)。

一般來(lái)說(shuō),軟中斷是由內(nèi)核機(jī)制的觸發(fā)事件引起的(例如進(jìn)程運(yùn)行超時(shí)),但是不可忽視有大量的軟中斷也是由于和硬件有關(guān)的中斷引起的,例如當(dāng)打印機(jī)端口產(chǎn)生一個(gè)硬件中斷時(shí),會(huì)通知和硬件相關(guān)的硬中斷,硬中斷就會(huì)產(chǎn)生一個(gè)軟中斷并送到操作系統(tǒng)內(nèi)核里,這樣內(nèi)核就會(huì)根據(jù)這個(gè)軟中斷喚醒睡眠在打印機(jī)任務(wù)隊(duì)列中的處理進(jìn)程。

硬中斷就是通常意義上的“中斷處理程序”,它是直接處理由硬件發(fā)過(guò)來(lái)的中斷信號(hào)的。當(dāng)硬中斷收到它應(yīng)當(dāng)處理的中斷信號(hào)以后,就回去自己驅(qū)動(dòng)的設(shè)備上去看看設(shè)備的狀態(tài)寄存器以了解發(fā)生了什么事情,并進(jìn)行相應(yīng)的操作。

對(duì)于軟中斷,我們不做討論,那是進(jìn)程調(diào)度里要考慮的事情。由于我們討論的是設(shè)備驅(qū)動(dòng)程序的中斷問(wèn)題,所以焦點(diǎn)集中在硬中斷里。我們這里討論的是硬中斷,即和硬件相關(guān)的中斷。

要中斷,是因?yàn)橥庠O(shè)需要通知操作系統(tǒng)她那里發(fā)生了一些事情,但是中斷的功能僅僅是一個(gè)設(shè)備報(bào)警燈,當(dāng)燈亮的時(shí)候中斷處理程序只知道有事情發(fā)生了,但發(fā)生了什么事情還要親自到設(shè)備那里去看才行。也就是說(shuō),當(dāng)中斷處理程序得知設(shè)備發(fā)生了一個(gè)中斷的時(shí)候,它并不知道設(shè)備發(fā)生了什么事情,只有當(dāng)它訪問(wèn)了設(shè)備上的一些狀態(tài)寄存器以后,才能知道具體發(fā)生了什么,要怎么去處理。

設(shè)備通過(guò)中斷線向中斷控制器發(fā)送高電平告訴操作系統(tǒng)它產(chǎn)生了一個(gè)中斷,而操作系統(tǒng)會(huì)從中斷控制器的狀態(tài)位知道是哪條中斷線上產(chǎn)生了中斷。PC機(jī)上使用的中斷控制器是8259,這種控制器每一個(gè)可以管理8條中斷線,當(dāng)兩個(gè)8259級(jí)聯(lián)的時(shí)候共可以控制15條中斷線。這里的中斷線是實(shí)實(shí)在在的電路,他們通過(guò)硬件接口連接到CPU外的設(shè)備控制器上。

并不是每個(gè)設(shè)備都可以向中斷線上發(fā)中斷信號(hào)的,只有對(duì)某一條確定的中斷線勇有了控制權(quán),才可以向這條中斷線上發(fā)送信號(hào)。由于計(jì)算機(jī)的外部設(shè)備越來(lái)越多,所以15條中斷線已經(jīng)不夠用了,中斷線是非常寶貴的資源。要使用中斷線,就得進(jìn)行中斷線的申請(qǐng),就是IRQ(Interrupt Requirement),我們也常把申請(qǐng)一條中斷線成為申請(qǐng)一個(gè)IRQ或者是申請(qǐng)一個(gè)中圓首斷號(hào)。

IRQ是非常寶貴的,所以我們建議只有當(dāng)設(shè)備需要中斷的時(shí)候才申請(qǐng)占用一個(gè)IRQ,或者是在申請(qǐng)IRQ時(shí)采用共享中斷的方式,這樣可以讓更多的設(shè)備使用中斷。無(wú)論對(duì)IRQ的使用方式是獨(dú)占還是共享,申請(qǐng)IRQ的過(guò)程都是一樣的,分為3步:

1.將所有的中斷線探測(cè)一遍,看看哪些中斷還沒(méi)有被占用。從這些還沒(méi)有被占用的中斷中選一個(gè)作為該設(shè)備的IRQ。

2.通過(guò)中斷申請(qǐng)函數(shù)申請(qǐng)選定的IRQ,這是要指定申請(qǐng)的方式是獨(dú)占還是共享。

3.根據(jù)中斷申請(qǐng)函數(shù)的返回值決定怎么做:如果成功了萬(wàn)事大吉,如果沒(méi)成功則或者重新申請(qǐng)或者放棄申請(qǐng)并返回錯(cuò)誤。

Linux中的中斷處理程序很有特色,它的一個(gè)中斷處理程序分為兩個(gè)部分:上半部(top half)和下半部(bottom half)。之所以會(huì)有上半部和下半部之分,完全是考慮到中斷處理的效率。

上半部的功能是“登記中斷”。當(dāng)一個(gè)中斷發(fā)生時(shí),他就把設(shè)備驅(qū)動(dòng)程序中中斷例程的下半部掛到該設(shè)備的下半部執(zhí)行隊(duì)列中去,然后就沒(méi)事情了–等待新的中斷的到來(lái)。這樣旁薯一來(lái),上半部執(zhí)行的速度就會(huì)很快,他就可以接受更多她負(fù)責(zé)的設(shè)備產(chǎn)生的中斷了。上半部之所以要快,是因?yàn)樗峭耆帘沃袛嗟?,如果她不?zhí)行完,其它的中斷就不能被及時(shí)的處理,只能等到這個(gè)中斷處理程序執(zhí)行完畢以后。所以,要盡可能多得對(duì)設(shè)備產(chǎn)生的中斷進(jìn)行服務(wù)和處理,中斷處理程序就一定要快。

但是,有些中斷事件的處理是比較復(fù)雜的,所以中斷處理程序必須多花一點(diǎn)時(shí)間才能夠把事情做完??稍趺礃踊庠诙虝r(shí)間內(nèi)完成復(fù)雜處理的矛盾呢,這時(shí)候 Linux引入了下半部的概念。下半部和上半部更大的不同是下半部是可中斷的,而上半部是不可中斷的。下半部幾乎做了中斷處理程序所有的事情,因?yàn)樯习氩恐皇菍⑾掳氩颗诺搅怂麄兯?fù)責(zé)的設(shè)備的中斷處理隊(duì)列中去,然后就什么都不管了。下半部一般所負(fù)責(zé)的工作是察看設(shè)備以獲得產(chǎn)生中斷的事件信息,并根據(jù)這些信息(一般通過(guò)讀設(shè)備上的寄存器得來(lái))進(jìn)行相應(yīng)的處理。如果有些時(shí)間下半部不知道怎么去做,他就使用著名的鴕鳥(niǎo)算法來(lái)解決問(wèn)題–說(shuō)白了就是忽略這個(gè)事件。

由于下半部是可中斷的,所以在它運(yùn)行期間,如果其它的設(shè)備產(chǎn)生了中斷,這個(gè)下半部可以暫時(shí)的中斷掉,等到那個(gè)設(shè)備的上半部運(yùn)行完了,再回頭來(lái)運(yùn)行它。但是有一點(diǎn)一定要注意,那就是如果一個(gè)設(shè)備中斷處理程序正在運(yùn)行,無(wú)論她是運(yùn)行上半部還是運(yùn)行下半部,只要中斷處理程序還沒(méi)有處理完畢,在這期間設(shè)備產(chǎn)生的新的中斷都將被忽略掉。因?yàn)橹袛嗵幚沓绦蚴遣豢芍厝氲模粋€(gè)中斷處理程序是不能并行的。

在Linux Kernel 2.0以前,中斷分為快中斷和慢中斷(偽中斷我們這里不談),其中快中斷的下半部也是不可中斷的,這樣可以保證它執(zhí)行的快一點(diǎn)。但是由于現(xiàn)在硬件水平不斷上升,快中斷和慢中斷的運(yùn)行速度已經(jīng)沒(méi)有什么差別了,所以為了提高中斷例程事務(wù)處理的效率,從Linux kernel 2.0以后,中斷處理程序全部都是慢中斷的形式了–他們的下半部是可以被中斷的。

但是,在下半部中,你也可以進(jìn)行中斷屏蔽–如果某一段代碼不能被中斷的話。你可以使用cti、sti或者是save_flag、restore_flag來(lái)實(shí)現(xiàn)你的想法。

在處理中斷的時(shí)候,中斷控制器會(huì)屏蔽掉原先發(fā)送中斷的那個(gè)設(shè)備,直到她發(fā)送的上一個(gè)中斷被處理完了為止。因此如果發(fā)送中斷的那個(gè)設(shè)備載中斷處理期間又發(fā)送了一個(gè)中斷,那么這個(gè)中斷就被永遠(yuǎn)的丟失了。

之所以發(fā)生這種事情,是因?yàn)橹袛嗫刂破鞑⒉荒芫彌_中斷信息,所以當(dāng)前一個(gè)中斷沒(méi)有處理完以前又有新的中斷到達(dá),他肯定會(huì)丟掉新的中斷的。但是這種缺陷可以通過(guò)設(shè)置主處理器(CPU)上的“置中斷標(biāo)志位”(sti)來(lái)解決,因?yàn)橹魈幚砥骶哂芯彌_中斷的功能。如果使用了“置中斷標(biāo)志位”,那么在處理完中斷以后使用sti函數(shù)就可以使先前被屏蔽的中斷得到服務(wù)。

有時(shí)候需要屏蔽中斷,可是為什么要將這個(gè)中斷屏蔽掉呢?這并不是因?yàn)榧夹g(shù)上實(shí)現(xiàn)不了同一中斷例程的并行,而是出于管理上的考慮。之所以在中斷處理的過(guò)程中要屏蔽同一IRQ來(lái)的新中斷,是因?yàn)橹袛嗵幚沓绦蚴遣豢芍厝氲?,所以不能并行?zhí)行同一個(gè)中斷處理程序。在這里我們舉一個(gè)例子,從這里子例中可以看出如果一個(gè)中斷處理程序是可以并行的話,那么很有可能會(huì)發(fā)生驅(qū)動(dòng)程序鎖死的情況。當(dāng)驅(qū)動(dòng)程序鎖死的時(shí)候,你的操作系統(tǒng)并不一定會(huì)崩潰,但是鎖死的驅(qū)動(dòng)程序所支持的那個(gè)設(shè)備是不能再使用了–設(shè)備驅(qū)動(dòng)程序死了,設(shè)備也就死了。

A是一段代碼,B是操作設(shè)備寄存器R1的代碼,C是操作設(shè)備寄存器R2的代碼。其中激發(fā)PS1的事件會(huì)使A1產(chǎn)生一個(gè)中斷,然后B1去讀R1中已有的數(shù)據(jù),然后代碼C1向R2中寫數(shù)據(jù)。而激發(fā)PS2的事件會(huì)使A2產(chǎn)生一個(gè)中斷,然后B2刪除R1中的數(shù)據(jù),然后C2讀去R2中的數(shù)據(jù)。

如果PS1先產(chǎn)生,且當(dāng)他執(zhí)行到A1和B1之間的時(shí)候,如果PS2產(chǎn)生了,這是A2會(huì)產(chǎn)生一個(gè)中斷,將PS2中斷掉(掛到任務(wù)隊(duì)列的尾部),然后刪除了 R1的內(nèi)容。當(dāng)PS2運(yùn)行到C2時(shí),由于C1還沒(méi)有向R2中寫數(shù)據(jù),所以C2將會(huì)在這里被掛起,PS2就睡眠在代碼C2上,直到有數(shù)據(jù)可讀的時(shí)候被信號(hào)喚醒。這是由于PS1中的B2原先要讀的R1中的數(shù)據(jù)被PS2中的B2刪除了,所以PS1頁(yè)會(huì)睡眠在B1上,直到有數(shù)據(jù)可讀的時(shí)候被信號(hào)喚醒。這樣一來(lái),喚醒PS1和PS2的事件就永遠(yuǎn)不會(huì)發(fā)生了,因此PS1和PS2之間就鎖死了。

由于設(shè)備驅(qū)動(dòng)程序要和設(shè)備的寄存器打交道,所以很難寫出可以重入的代碼來(lái),因?yàn)樵O(shè)備寄存器就是全局變量。因此,最簡(jiǎn)潔的辦法就是禁止同一設(shè)備的中斷處理程序并行,即設(shè)備的中斷處理程序是不可重入的。

有一點(diǎn)一定要清楚:在2.0版本以后的Linux kernel中,所有的上半部都是不可中斷的(上半部的操作是原子性的);不同設(shè)備的下半部可以互相中斷,但一個(gè)特定的下半部不能被它自己所中斷(即同一個(gè)下半部不能并)。

由于中斷處理程序要求不可重入,所以程序員也不必為編寫可重入的代碼而頭痛了。編寫可重入的設(shè)備驅(qū)動(dòng)程序是可以的,編寫可重入的中斷處理程序是非常難得,幾乎不可能。

我們都知道,一旦競(jìng)爭(zhēng)條件出現(xiàn)了,就有可能會(huì)發(fā)生死鎖的情況,嚴(yán)重時(shí)可能會(huì)將整個(gè)系統(tǒng)鎖死。所以一定要避免競(jìng)爭(zhēng)條件的出現(xiàn)。只要注意一點(diǎn):絕大多數(shù)由于中斷產(chǎn)生的競(jìng)爭(zhēng)條件,都是在帶有中斷的

內(nèi)核進(jìn)程被睡眠造成的。所以在實(shí)現(xiàn)中斷的時(shí)候,一定要相信謹(jǐn)慎的讓進(jìn)程睡眠,必要的時(shí)候可以使用cli、sti或者save_flag、restore_flag。

linux c 信號(hào)屏蔽的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux c 信號(hào)屏蔽,Linux C 下信號(hào)屏蔽:保障穩(wěn)定運(yùn)行的重要手段,linux 內(nèi)核中斷 用什么鎖,LINUX軟中斷通信的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


分享題目:LinuxC下信號(hào)屏蔽:保障穩(wěn)定運(yùn)行的重要手段(linuxc信號(hào)屏蔽)
網(wǎng)址分享:http://www.dlmjj.cn/article/djicdjh.html