• <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>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            我對信號的理解

            Posted on 2009-01-13 11:07 Prayer 閱讀(332) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

            自己寫了一些代碼,看看到底內部如何處理的。
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <errno.h> 
            #include <signal.h> 
            #include <sys/stat.h>
            #include <stdarg.h>

            pid_t pid;

            void mydebug(char *fmt, ...){
                va_list     argptr;
                FILE        *pFile;
                if( ( pFile = fopen( "./mylog", "a+" ) ) == NULL )
             return;

                va_start( argptr, fmt );
                vfprintf( pFile, fmt, argptr );
                va_end( argptr );

                fclose( pFile ); 
             }

            void sigTermHandler()
            {
                kill(pid,SIGTERM);
            }

            int main(){
               int i=0;
              signal(SIGTERM,(void (*)( ))sigTermHandler);
             
               mydebug("創建進程\n");
               if((pid=fork())<0){
                mydebug("fork失敗\n");
                return -1;     
               }
               if(pid==0){
               if(execl("./sig2",(char *) 0) < 0){
                    mydebug("execl失敗\n");
                exit(1);
                }    
                }
                mydebug("等待100秒\n");    
                sleep(10);
                while(1){
                  kill(pid,SIGUSR1);
                  mydebug("已發送了USR1信號 %d\n",i++);
                  sleep(5);     
                 }
                return 1;
            }


            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <errno.h> 
            #include <signal.h> 
            #include <sys/stat.h>
            #include <stdarg.h>

            void mydebug(char *fmt, ...){
                va_list     argptr;
                FILE        *pFile;
                if( ( pFile = fopen( "./mylog", "a+" ) ) == NULL )
             return;

                va_start( argptr, fmt );
                vfprintf( pFile, fmt, argptr );
                va_end( argptr );

                fclose( pFile ); 
             }

            void sigUsr1Handler()
            {
             signal(SIGUSR1,SIG_IGN);
              mydebug("進入了信號處理函數\n");
             signal(SIGUSR1,(void (*)( ))sigUsr1Handler);
            }
            void sigTermHandler()
            {
             mydebug("接受到SIGTERM信號,退出\n");
             exit(0);
            }

            int main(){
               int i=0;
              signal(SIGUSR1,(void (*)( ))sigUsr1Handler); 
              signal(SIGTERM,(void (*)( ))sigTermHandler);
             
               mydebug("進入循環\n");
               while(1){
                  sleep(10);
                  mydebug("i=%d\n",i++);
                }
               mydebug("退出程序\n");    
               return 0;
            }


            cc sig1.c -o sig1
            cc sig2.c -o sig2
            (使用-o sig1.o沒有編譯出應用程序,也沒有提示錯誤)

            sig1&
            tail -f mylog
            創建進程
            等待100秒
            進入循環
            已發送了USR1信號 0
            進入了信號處理函數
            i=0
            已發送了USR1信號 1
            進入了信號處理函數
            i=1
            已發送了USR1信號 2
            進入了信號處理函數
            i=2
            已發送了USR1信號 3
            進入了信號處理函數
            i=3
            已發送了USR1信號 4
            進入了信號處理函數
            i=4
            已發送了USR1信號 5
            進入了信號處理函數
            i=5
            已發送了USR1信號 6
            進入了信號處理函數
            i=6
            已發送了USR1信號 7
            進入了信號處理函數
            i=7
            已發送了USR1信號 8
            進入了信號處理函數
            i=8
            已發送了USR1信號 9
            進入了信號處理函數


            此時,在shell下使用kill殺死sig1,則根據sig1的sigTermHandler,sig2會被殺死。

            接受到SIGTERM信號,退出
            已發送了USR1信號 10
            已發送了USR1信號 11
            已發送了USR1信號 12
            已發送了USR1信號 13
            已發送了USR1信號 14
            已發送了USR1信號 15
            已發送了USR1信號 16
            已發送了USR1信號 17

            但是sig1本身沒有被殺死,這時因為沒有在sigTermHandler里面重新注冊signal(SIGTERM,(void (*)( ))sigTermHandler);
            執行了一次sigTermHandler后,對SIGTERM的處理恢復到系統默認的處理。
            然后再一次執行kill,殺死sig1,則sig1被殺死。


            --可以看出,如果信號處理函數內部沒有exit,則進程不會退出,只是回到原來被中斷的地方繼續執行。
            久久96国产精品久久久| 久久综合给合久久国产免费| 曰曰摸天天摸人人看久久久| 国产精品嫩草影院久久| 午夜精品久久影院蜜桃| 久久久久久久97| 久久久久人妻一区精品性色av| 久久一日本道色综合久久| 久久精品国产秦先生| 久久久久成人精品无码| 亚洲va国产va天堂va久久| 欧美综合天天夜夜久久| 久久精品人妻中文系列| 精品免费久久久久国产一区| 中文无码久久精品| 久久精品二区| 精品久久久久久国产91| 日产精品久久久久久久| 久久精品亚洲男人的天堂| 国产午夜福利精品久久2021| 中文字幕无码久久精品青草| 人人狠狠综合久久亚洲88| 国产成人精品综合久久久久| 久久精品无码免费不卡| 99999久久久久久亚洲| 久久无码AV一区二区三区| 久久九色综合九色99伊人| 91精品国产综合久久精品| 性欧美丰满熟妇XXXX性久久久| 久久亚洲高清综合| 国产日韩久久免费影院| WWW婷婷AV久久久影片| 欧洲人妻丰满av无码久久不卡 | 狠狠色婷婷久久一区二区三区| 久久综合九色欧美综合狠狠| 嫩草影院久久99| 久久国产精品久久| 久久97精品久久久久久久不卡| 97久久国产亚洲精品超碰热| 99久久人妻无码精品系列蜜桃| 久久久噜噜噜久久中文福利|