色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          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://cafeforensic.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)閉