在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > linux內(nèi)核中的信號(hào)機(jī)制--從用戶層到內(nèi)核層

            linux內(nèi)核中的信號(hào)機(jī)制--從用戶層到內(nèi)核層

            作者: 時(shí)間:2016-11-22 來(lái)源:網(wǎng)絡(luò) 收藏
            Kernel version:2.6.14

            CPU architecture:ARM920T

            本文引用地址:http://www.biyoush.com/article/201611/320007.htm

            Author:ce123(http://blog.csdn.net/ce123)


            1.簡(jiǎn)介

            如果進(jìn)程要處理某一信號(hào),那么要在進(jìn)程中注冊(cè)該信號(hào)。注冊(cè)信號(hào)主要用來(lái)確定信號(hào)值及進(jìn)程針對(duì)該信號(hào)值的動(dòng)作之間的映射關(guān)系,即進(jìn)程將要處理哪個(gè)進(jìn)程和該信號(hào)被傳遞給進(jìn)程時(shí),將執(zhí)行何種操作。主要有兩個(gè)函數(shù)實(shí)現(xiàn)信號(hào)的注冊(cè):signal()和sigaction()。

            2.signal()

            signal()的函數(shù)原型如下:

            [plain]view plaincopy
            print?
            1. void(*signal(intsignum,void(*handler)(int)))(int);
            在使用該調(diào)用的進(jìn)程中加入以下頭文件:
            [plain]view plaincopy
            print?
            1. #include

            上述聲明格式比較復(fù)雜,如果不清楚如何使用,也可以通過(guò)下面這種類型定義的格式來(lái)使用(POSIX的定義):

            [plain]view plaincopy
            print?
            1. typedefvoid(*sighandler_t)(int);
            2. sighandler_tsignal(intsignum,sighandler_thandler);
            但這種格式在不同的系統(tǒng)中有不同的類型定義,所以要使用這種格式,最好還是參考一下手冊(cè)。在調(diào)用中,參數(shù)signum指出要設(shè)置處理方法的信號(hào)。第二個(gè)參數(shù)handler是一個(gè)處理函數(shù),或者是
            • SIG_IGN:忽略參數(shù)signum所指的信號(hào)。
            • SIG_DFL:恢復(fù)參數(shù)signum所指信號(hào)的處理方法為默認(rèn)值。
            傳遞給信號(hào)處理例程的整數(shù)參數(shù)是信號(hào)值,這樣可以使得一個(gè)信號(hào)處理例程處理多個(gè)信號(hào)。系統(tǒng)調(diào)用signal()返回值是指定信號(hào)signum前一次的處理例程或者錯(cuò)誤時(shí)返回錯(cuò)誤代碼SIG_ERR。

            signal()通過(guò)系統(tǒng)調(diào)用sys_signal()為一個(gè)指定的信號(hào)設(shè)置用戶態(tài)處理函數(shù)。sys_signal()定義如下:

            [plain]view plaincopy
            print?
            1. /*
            2. *Forbackwardscompatibility.Functionalitysupersededbysigaction.
            3. */
            4. asmlinkageunsignedlong
            5. sys_signal(intsig,__sighandler_thandler)
            6. {
            7. structk_sigactionnew_sa,old_sa;
            8. intret;
            9. new_sa.sa.sa_handler=handler;
            10. new_sa.sa.sa_flags=SA_ONESHOT|SA_NOMASK;
            11. ret=do_sigaction(sig,&new_sa,&old_sa);
            12. returnret?ret:(unsignedlong)old_sa.sa.sa_handler;
            13. }

            __sighandler_t的定義如下:

            [plain]view plaincopy
            print?
            1. typedefvoid__signalfn_t(int);
            2. typedef__signalfn_t__user*__sighandler_t;

            信號(hào)由sys_signal()的第一個(gè)參數(shù)指定,信號(hào)處理函數(shù)的地址由第二個(gè)參數(shù)指定。sys_signal()根據(jù)這兩個(gè)參數(shù)設(shè)置一個(gè)k_sigaction結(jié)構(gòu),然后調(diào)用do_sigaction(),該函數(shù)的定義我們會(huì)在后面具體講解。

            2.sigaction()

            sigaction()的函數(shù)原型如下:

            [plain]view plaincopy
            print?
            1. sigaction(intsignum,conststructsigaction*act,structsigaction*oldact);
            sigaction()對(duì)應(yīng)的系統(tǒng)調(diào)用為do_sigaction(),下面我們具體講解do_sigaction()函數(shù),其定義如下:

            2.1do_sigaction()

            [plain]view plaincopy
            print?
            1. int
            2. do_sigaction(intsig,conststructk_sigaction*act,structk_sigaction*oact)
            3. {
            4. structk_sigaction*k;
            5. if(!valid_signal(sig)||sig<1||(act&&sig_kernel_only(sig)))
            6. return-EINVAL;
            7. k=¤tt->sighand->action[sig-1];
            8. spin_lock_irq(¤tt->sighand->siglock);
            9. if(signal_pending(current)){
            10. /*
            11. *Iftheremightbeafatalsignalpendingonmultiple
            12. *threads,makesurewetakeitbeforechangingtheaction.
            13. */
            14. spin_unlock_irq(¤tt->sighand->siglock);
            15. return-ERESTARTNOINTR;
            16. }
            17. if(oact)//把原來(lái)的k_sigaction保存到oact結(jié)構(gòu)中,這里是對(duì)整個(gè)數(shù)據(jù)結(jié)構(gòu)進(jìn)行復(fù)制
            18. *oact=*k;
            19. if(act){
            20. /*
            21. *POSIX3.3.1.3:
            22. *"SettingasignalactiontoSIG_IGNforasignalthatis
            23. *pendingshallcausethependingsignaltobediscarded,
            24. *whetherornotitisblocked."
            25. *
            26. *"SettingasignalactiontoSIG_DFLforasignalthatis
            27. *pendingandwhosedefaultactionistoignorethesignal
            28. *(forexample,SIGCHLD),shallcausethependingsignalto
            29. *bediscarded,whetherornotitisblocked"
            30. */
            31. if(act->sa.sa_handler==SIG_IGN||
            32. (act->sa.sa_handler==SIG_DFL&&
            33. sig_kernel_ignore(sig))){
            34. /*
            35. *Thisisafairlyrarecase,soweonlytakethe
            36. *tasklist_lockonceweresurewellneedit.
            37. *Nowwemustdothislittleunlockandrelock
            38. *dancetomaintainthelockhierarchy.
            39. */
            40. structtask_struct*t=current;
            41. spin_unlock_irq(&t->sighand->siglock);
            42. read_lock(&tasklist_lock);
            43. spin_lock_irq(&t->sighand->siglock);
            44. *k=*act;//把新的k_sigaction結(jié)構(gòu)復(fù)制到進(jìn)程的sighand->action中
            45. sigdelsetmask(&k->sa.sa_mask,
            46. sigmask(SIGKILL)|sigmask(SIGSTOP));
            47. rm_from_queue(sigmask(sig),&t->signal->shared_pending);
            48. do{
            49. rm_from_queue(sigmask(sig),&t->pending);
            50. recalc_sigpending_tsk(t);
            51. t=next_thread(t);
            52. }while(t!=current);
            53. spin_unlock_irq(¤t->sighand->siglock);
            54. read_unlock(&tasklist_lock);
            55. return0;
            56. }
            57. *k=*act;//把新的k_sigaction結(jié)構(gòu)復(fù)制到進(jìn)程的sighand->action中
            58. sigdelsetmask(&k->sa.sa_mask,
            59. sigmask(SIGKILL)|sigmask(SIGSTOP));
            60. }
            61. spin_unlock_irq(¤tt->sighand->siglock);
            62. return0;
            63. }



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉