linux 自定義信號


 

   從來沒試過linux自定義信號,查了下,說是系統只提供了SIGUSR1和SIGUSR2兩個,就兩個夠嗎?更要命的是如果要自定義信號如#define SIG_MYSIG   ....的話要改內核才行,哥瞬間就崩潰了,以前一直對linux的敬仰頓然全無,還好在這里找到了方法

http://bbs.chinaunix.net/viewthread.php?tid=989499

即是可以的,可按照這樣#define MYSIG_MSG        SIGUSR1 + 20定義后,發現程序運行后總是馬上就直接終止運行了,用eclipse跳轉過去一看#define    SIGUSR1        10    /* User-defined signal 1 (POSIX).  */,而加20就變成了30,30是什么?30是 #define    SIGPWR        30  ,翻開《UNIX環境高級編程》一查這可是電源失效或重啟動呀哥。哪位大俠最先說是在SIGUSR1基礎上定義的?我就不信你實驗成功了!!!!!!!!!!!!

正確方法是在__SIGRTMIN(32)基礎上定義的,__SIGRTMIN(32)到__SIGRTMAX(64)是留着的實時信號,於是我定義了#define SIG_RECVDATA    __SIGRTMIN+1,

可還是不行?程序其它幾處非靜態成員函數惹來的麻煩已夠多了,我還以為是那些地方出了錯,最后才發現signal調用時signal(SIG_RECVDATA,InternalRecvSigHandler),它總是返回SIG_ERR,即根本從一開始注冊信號就沒有成功 ,難道32-64真是系統預留的實時信號,不是給開發者的??,經過一番掙扎,在CSDN上幾句短短的回復中發現說__SIGRTMIN基礎上的前3個最好不要用,它是linuxthread用的,真是蛋疼,你內部要用 的話把__SIGRTMIN定義大點嘛,總之__SIGRTMIN和__SIGRTMAX之間的一定能用就好!!

最后改成#define SIG_RECVDATA    __SIGRTMIN+10,哎,終於成功了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM