• <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 閱讀(334) 評論(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,則進程不會退出,只是回到原來被中斷的地方繼續執行。
            97r久久精品国产99国产精| 麻豆精品久久久一区二区| 久久露脸国产精品| 亚洲欧美日韩久久精品| 中文国产成人精品久久不卡| 色综合久久中文色婷婷| 最新久久免费视频| 亚洲国产精品久久66| 狠狠色综合网站久久久久久久高清| 亚洲精品成人网久久久久久| 欧美国产成人久久精品| 狠狠88综合久久久久综合网| 看全色黄大色大片免费久久久| 久久国产精品99国产精| 蜜臀久久99精品久久久久久| 国产精品天天影视久久综合网| 久久久国产精品| 粉嫩小泬无遮挡久久久久久| 亚洲欧美国产日韩综合久久| 99久久精品这里只有精品| 久久夜色精品国产噜噜亚洲AV| 精品久久久久久久久久中文字幕| 综合网日日天干夜夜久久| 欧美日韩中文字幕久久伊人| 亚洲AV日韩精品久久久久久| 香蕉久久AⅤ一区二区三区| 天天久久狠狠色综合| 久久久久亚洲AV片无码下载蜜桃 | 国产精品久久久久9999高清| 亚洲国产成人乱码精品女人久久久不卡 | 一级做a爰片久久毛片看看| 亚洲狠狠综合久久| 久久久久亚洲AV无码专区体验| 久久久久人妻精品一区| 欧美精品国产综合久久| 久久人人爽人人精品视频| 久久影视国产亚洲| 久久亚洲色一区二区三区| 欧美激情精品久久久久久久| 一本久道久久综合狠狠躁AV| 久久精品无码一区二区三区免费|