<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > linux內核中的信號機制--從用戶(hù)層到內核層

linux內核中的信號機制--從用戶(hù)層到內核層

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

CPU architecture:ARM920T

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

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


1.簡(jiǎn)介

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

2.signal()

signal()的函數原型如下:

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

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

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

signal()通過(guò)系統調用sys_signal()為一個(gè)指定的信號設置用戶(hù)態(tài)處理函數。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;

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

2.sigaction()

sigaction()的函數原型如下:

[plain]view plaincopy
print?
  1. sigaction(intsignum,conststructsigaction*act,structsigaction*oldact);
sigaction()對應的系統調用為do_sigaction(),下面我們具體講解do_sigaction()函數,其定義如下:

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結構中,這里是對整個(gè)數據結構進(jìn)行復制
  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結構復制到進(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結構復制到進(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. }



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>