Linux驅(qū)動編程之信號機(jī)制

編寫Linux驅(qū)動的過程中性芬,需要考慮與應(yīng)用程序交互的情況褪那。當(dāng)設(shè)備驅(qū)動完成某項任務(wù)或者達(dá)到某種狀態(tài)的時候(如設(shè)備文件可以寫入或讀攘头堋)蔫缸,此時可以讓驅(qū)動程序主動通知應(yīng)用程序進(jìn)行相應(yīng)的處理(個人感覺類似于Android應(yīng)用程序中的廣播)哪轿。這種在Linux內(nèi)核中使用的“廣播”就是本文要詳細(xì)介紹的“信號”。

1. Linux信號類型

使用信號進(jìn)行進(jìn)程間通信(IPC)是LInux系統(tǒng)的重要通信機(jī)制华烟。在Linux系統(tǒng)中坑鱼,異步通知使用信號來實現(xiàn)。以下是Linux系統(tǒng)支持的信號及其含義:(asm/signal.h)

#define SIGHUP       1
#define SIGINT       2
#define SIGQUIT     3
#define SIGILL       4
#define SIGTRAP     5
#define SIGABRT     6
#define SIGIOT       6
#define SIGBUS       7
#define SIGFPE       8
#define SIGKILL     9
#define SIGUSR1     10
#define SIGSEGV     11
#define SIGUSR2     12
#define SIGPIPE     13
#define SIGALRM     14
#define SIGTERM     15
#define SIGSTKFLT     16
#define SIGCHLD     17
#define SIGCONT     18
#define SIGSTOP     19
#define SIGTSTP     20
#define SIGTTIN     21
#define SIGTTOU     22
#define SIGURG       23
#define SIGXCPU     24
#define SIGXFSZ     25
#define SIGVTALRM     26
#define SIGPROF     27
#define SIGWINCH       28
#define SIGIO         29
#define SIGPOLL     SIGIO
#define SIGPWR       30
#define SIGSYS       31

/* These should not be considered constants from userland.  */
#define SIGRTMIN       32
#define SIGRTMAX       _NSIG

#define SIGSWI       32

注:以上除了SISSTOP和SIGKILL兩個信號外动漾,進(jìn)程可以忽略或捕獲其他的全部信號丁屎。

如果其中一個信號被捕獲,說明在應(yīng)用程序中為該信號指定了一個處理函數(shù)晨川。如果一個信號沒有被某個進(jìn)程捕獲,Linux內(nèi)核會對該信號采用默認(rèn)處理方式進(jìn)行處理共虑。

2. 接收Linux信號

在用戶程序中,為了捕捉信號妈拌,需要使用signal函數(shù)來設(shè)置信號接收的回調(diào)函數(shù):

void  (*signal(int signum, void (* handler)(int)))(int);

從signal函數(shù)原型上看有些復(fù)雜, 但主要有兩個參數(shù):signum和handler蓬蝶,signum表示信號代碼尘分,handler表示回調(diào)函數(shù)。

在應(yīng)用程序中捕獲信號比較簡單音诫,如下例子:

void signal_handler(int signo)
{
        printf("捕獲到%d信號\n",signo);
}
main()
{
        printf("信號ID是%d\n"竭钝,getpid());
        signal(SIGINT, signal_handler);            //設(shè)置SIGINT信號的處理函數(shù)
        signal(SIGHUP, signal_handler);          //設(shè)置SIGHUP信號的處理函數(shù)
        signal(SIGQUIT, signal_handler);         //設(shè)置SIGQUIT信號的處理函數(shù)
       getchar();
}

以上代碼示例了如何捕捉信號,并設(shè)置相應(yīng)的處理函數(shù)雹洗。

3香罐、發(fā)送信號

在設(shè)備驅(qū)動和應(yīng)用程序的異步通知過程中,驅(qū)動程序需要向應(yīng)用程序發(fā)出信號时肿,為了完成發(fā)送信號的任務(wù)庇茫,需要完成以下工作:

  1. 支持F_SETDOWN命令螃成。通過這個命令可以設(shè)置file_f_owner為對應(yīng)進(jìn)程的ID。
  2. 支持F_SETFL命令的處理寸宏。每當(dāng)FASYNC標(biāo)志改變時,驅(qū)動程序中的fasync函數(shù)就會執(zhí)行氮凝。
  3. 再滿足條件時,調(diào)用kill_fasync函數(shù)發(fā)送相應(yīng)的信號。

接收信號可以用signal函數(shù)和sigaction函數(shù)來完成启摄,他們之間有以下幾個區(qū)別:
signal函數(shù)
1、signal在調(diào)用handler之前先把信號的handler指針恢復(fù)歉备;sigaction調(diào)用之后不會恢復(fù)handler指針,直到再次調(diào)用sigaction修改handler指針威创。
:這樣谎懦,(1)signal就會丟失信號肚豺,而且不能處理重復(fù)的信號界拦,而sigaction就可以。因為signal在得到信號和調(diào)用handler之間有個時間把handler恢復(fù)了享甸,這樣再次接收到此信號就會執(zhí)行默認(rèn)的handler。(雖然有些調(diào)用蛉威,在handler的以開頭再次置handler,這樣只能保證丟信號的概率降低蚯嫌,但是不能保證所有的信號都能正確處理)
2、signal在調(diào)用過程不支持信號block束凑;sigaction調(diào)用后在handler調(diào)用之前會把屏蔽信號(屏蔽信號中自動默認(rèn)包含傳送的該信號)加入信號中,handler調(diào)用后會自動恢復(fù)信號到原先的值汪诉。
(2)signal處理過程中就不能提供阻塞某些信號的功能,sigaction就可以阻指定的信號和本身處理的信號谈秫,直到handler處理結(jié)束扒寄。這樣就可以阻塞本身處理的信號,到handler結(jié)束就可以再次接受重復(fù)的信號拟烫。

在驅(qū)動程序編寫過程中與應(yīng)用程序進(jìn)行交互是非常重要的,他可以確保用戶程序能夠順利執(zhí)行构灸,也能保證驅(qū)動能夠更好地服務(wù)于用戶。以上是本人學(xué)習(xí)中的一些總結(jié)喜颁,希望對大家有幫助~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隔披,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奢米,老刑警劉巖纠永,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尝江,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炭序,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門惭聂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗声,“玉大人辜纲,你說我怎么就攤上這事∏惹福” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵炮温,是天一觀的道長牵舵。 經(jīng)常有香客問我柒啤,道長畸颅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任涛癌,我火速辦了婚禮,結(jié)果婚禮上拳话,老公的妹妹穿的比我還像新娘。我一直安慰自己弃衍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布镜盯。 她就那樣靜靜地躺著,像睡著了一般降允。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拟糕,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天倦踢,我揣著相機(jī)與錄音,去河邊找鬼辱挥。 笑死,一個胖子當(dāng)著我的面吹牛晤碘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播园爷,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼求厕!你這毒婦竟也來了扰楼?” 一聲冷哼從身側(cè)響起呀癣,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤弦赖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沼沈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體流酬,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡列另,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年访递,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拷姿。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡旱函,死狀恐怖响巢,靈堂內(nèi)的尸體忽然破棺而出棒妨,到底是詐尸還是另有隱情,我是刑警寧澤券腔,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站枕扫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烟瞧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一参滴、第九天 我趴在偏房一處隱蔽的房頂上張望锻弓。 院中可真熱鬧,春花似錦弥咪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扳躬。三九已至甚亭,卻和暖如春击胜,著一層夾襖步出監(jiān)牢的瞬間亏狰,已是汗流浹背偶摔。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留策州,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓够挂,卻偏偏與公主長得像藕夫,于是被迫代替她去往敵國和親孽糖。 傳聞我的和親對象是個殘疾皇子毅贮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容