• <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,則進程不會退出,只是回到原來被中斷的地方繼續執行。
            精品免费久久久久久久| 国产亚洲精品美女久久久| 狠狠干狠狠久久| 999久久久无码国产精品| 久久91精品久久91综合| 久久精品国产影库免费看| 国产成人精品久久亚洲| 国产成人精品久久亚洲高清不卡| 久久涩综合| 精品久久久久久成人AV| 一本色道久久88加勒比—综合| 亚洲欧洲精品成人久久曰影片| 麻豆成人久久精品二区三区免费 | 91久久婷婷国产综合精品青草 | 久久免费观看视频| 午夜人妻久久久久久久久| 久久国产成人精品国产成人亚洲| 人妻少妇久久中文字幕一区二区| 岛国搬运www久久| 日本久久久久亚洲中字幕| 人妻丰满?V无码久久不卡| 久久精品国产一区| 天天躁日日躁狠狠久久| 久久久久九九精品影院| 国产一级做a爰片久久毛片| 无码乱码观看精品久久| 91麻豆精品国产91久久久久久| 97久久国产综合精品女不卡| 亚洲日本va午夜中文字幕久久 | 国产精品久久久久久久人人看| 国产精品久久久亚洲| 久久这里有精品| 久久久久久国产a免费观看黄色大片 | 久久伊人亚洲AV无码网站| 999久久久无码国产精品| 精品一二三区久久aaa片| 久久久久久久久久久精品尤物| 久久涩综合| 久久精品国产男包| 久久精品国产亚洲AV香蕉| 久久午夜福利无码1000合集|