• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            旅途

            如果想飛得高,就該把地平線忘掉

            Linux下的信號處理

            一個最簡單的信號信號處理例子:
            #include <signal.h>
            #include <sys/types.h>
            #include <unistd.h>
            #include <stdio.h>

            void signal_rec(int signum, siginfo_t *info, void *myop)
            {
            ?printf("receive signal %d\n", signum);
            ?sleep(5);?
            }

            int main(int argc,char **argv)
            {
            ?struct sigaction act;
            ?int sig,i;
            ?
            ?sigemptyset(&act.sa_mask);
            ?act.sa_flags = SA_SIGINFO;
            ?act.sa_sigaction = signal_rec;
            ?
            ?for(i=1; i<argc; i++){ //argv[0]為調(diào)用程序名
            ??sig = atoi(argv[i]);
            ??if(sigaction(sig, &act, NULL) <0){
            ???printf("install signal error\n");
            ??}?
            ?}
            ?
            ?while(1){
            ??sleep(2);
            ??printf("wait for the signal\n");
            ?}
            }
            用法:
            將文件保存為test.c,執(zhí)行make test,編譯生成test文件。
            ./test 36 39&
            命令的意思是注冊信號36,39。命令結(jié)果會返回pid,假設(shè)為2625。
            通過另外一個終端向2625進程發(fā)送信號。例如:kill -s 36 2625
            則我們可以看到signal_rec函數(shù)被執(zhí)行了。
            當(dāng)我們發(fā)送40信號,我們會發(fā)送程序終止了,這是因為對于實時信號,默認(rèn)的操作是終止。
            關(guān)于信號:
            ?Linux 支持的信號分為可靠信號和不可靠信號。此處的可靠與不可靠不是指系統(tǒng)是不是可靠的可靠,而是對于可靠信息來說,每一次信號發(fā)實都每被加到信號鏈中,所以是 可靠的;而對于不可靠信號來說,如果進程之前已經(jīng)接收到該信號,則不會被加到信號鏈中,因此對于此次發(fā)送的信號來說,對于該進程來說是不知道的,所就是說 信號丟失了,因此是不可靠的。
            ?不可靠信號主要是在早期信號機制上的信號。一般來說,信號值小于SIGRTMIN的信號為不可靠信號,不可靠信號又稱為非實時信號。可靠信號又稱為實時信號。實時信號是SIGRTMIN和SIGRTMAX間的所有信號。
            ?我們可以通過kill -l查看SIGRTMIN和SIGRTMAX的值。在Debian系統(tǒng)和Redhat上面,一般SIGRTMIN=33,SIGRTMAX=64。
            ?Linux既支持新的信號安裝函數(shù)sigation以及信號發(fā)送函數(shù)sigqueue,又支持早期的signal信號安裝函數(shù)和kill信號發(fā)送函數(shù)。
            ?信號的可靠與不可靠只與信號值有關(guān),與信號的發(fā)送和安裝函數(shù)無關(guān),也就是說在Linux下即使使用sigaction和sigqueue也不可能將不可靠信號變?yōu)榭煽啃盘枴?br />信號發(fā)送函數(shù)主要有以下幾個:kill,raise,sigqueue,alarm,settimer,abort。
            信號安裝函數(shù)主要有signal和sigaction。sigaction主要用于與sigqueue系統(tǒng)調(diào)用配合使用,主要用于實時信號處理。
            信號集操作主要有以下幾個函數(shù):sigemptyset,sigfillset,sigaddset,sigdelset,sigismember。
            信號的阻塞的未決主要有以下幾個函數(shù):sigprocmask,sigsuspend,sigpending。
            最后以一個讀串口設(shè)備時用到的信號處理作為結(jié)尾(在上次的初始化串口設(shè)備中已經(jīng)出現(xiàn)過):
            在讀取設(shè)備數(shù)據(jù)或者進行網(wǎng)絡(luò)應(yīng)用的時候,為了防止程序進入死鎖,我們需要設(shè)置超時操作,即比如我們讀串口設(shè)備,嘗試一定時間后仍然沒有響應(yīng),則可能設(shè)備沒有正常工作。那么在超時以后我們需要退出,否則程序就鎖住了。
            我們現(xiàn)在使用SIGALRM信號來進行這個處理(這種方式并不是最好的辦法):
            我們假設(shè)有一個標(biāo)記是否超時的全局變量caught_alrm,默認(rèn)為0,為1時則表示超時。
            static volatile sig_atomic_t caught_alrm;
            static void sig_alrm(int signo){//信號處理函數(shù),設(shè)置超時全局變量為1。
            ??????? caught_alrm = 1;
            ??????? return;
            }
            int a_function{
            ?……
            ??? if(signal(SIGALRM, sig_alrm) == SIG_ERR){
            ??? ?syslog(LOG_ERR,"signal error in function:%s",__FUNCTION__);
            ??????? return -1;
            ??? }
            ??? caught_alrm = 0;
            ??? alarm(expalarm);
            ??? do{
            ??? ?//do something
            ??? ?//if the work is finished,call alarm(0) to clean the timer.
            ??? }while(caught_alrm == 0);
            }
            注:
            1、本文為整理以前的工作筆記,如果您要轉(zhuǎn)載,請注意來源為爾雅,作者覃士國。如果您有任何問題歡迎交流:shiguo.qin@gmail.com
            2、 此文僅僅是一則筆記,如果您正在尋找關(guān)于Linux信號編程方面的資料,可以參考鄭彥興的一篇文章:http://www- 128.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html。此文詳細(xì)描述了很多關(guān)于信 號處理中的結(jié)構(gòu)等內(nèi)容,是學(xué)習(xí)信號編程的一篇不錯的教程式文章。

            ?

            posted on 2007-08-02 00:25 旅途 閱讀(824) 評論(0)  編輯 收藏 引用 所屬分類: Linux開發(fā)

            亚洲乱码日产精品a级毛片久久| 久久99毛片免费观看不卡 | 伊人久久大香线蕉无码麻豆 | 亚洲国产精品成人AV无码久久综合影院 | 国产精品久久久久久吹潮| 久久亚洲国产午夜精品理论片| 精品久久人人做人人爽综合| 久久丫忘忧草产品| 久久久久中文字幕| 久久精品国产亚洲AV影院| 天天久久狠狠色综合| 国色天香久久久久久久小说| 国产精品va久久久久久久| 色婷婷综合久久久久中文| 狠狠色丁香婷婷综合久久来来去| 精品国产青草久久久久福利| 久久er国产精品免费观看2| 7777精品伊人久久久大香线蕉| 久久国产精品一区二区| 色欲综合久久躁天天躁蜜桃| 亚洲精品乱码久久久久久蜜桃| 青青草国产精品久久| 国产成人精品白浆久久69 | 久久er热视频在这里精品| 无码人妻久久久一区二区三区| 免费一级做a爰片久久毛片潮| 国产一级持黄大片99久久| 久久精品毛片免费观看| 精品国产青草久久久久福利| 狠狠色丁香久久婷婷综合_中| 久久久久久极精品久久久| 国产A级毛片久久久精品毛片| 99久久国产热无码精品免费| 久久狠狠高潮亚洲精品| 漂亮人妻被黑人久久精品| 色婷婷综合久久久中文字幕| 久久天天躁狠狠躁夜夜96流白浆| 亚洲∧v久久久无码精品| 性色欲网站人妻丰满中文久久不卡| 久久99久久99精品免视看动漫| 久久天天躁夜夜躁狠狠躁2022 |