• <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 閱讀(339) 評論(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,則進程不會退出,只是回到原來被中斷的地方繼續執行。
            久久99精品国产一区二区三区| 一本色道久久88综合日韩精品| 久久免费的精品国产V∧| 国产精品99久久久久久人| 国产一区二区三精品久久久无广告 | aaa级精品久久久国产片| 久久黄色视频| 久久精品无码午夜福利理论片| 久久精品女人天堂AV麻| 99久久人妻无码精品系列蜜桃 | 久久久久久精品免费看SSS| 一级做a爰片久久毛片16| 久久久久久人妻无码| 伊色综合久久之综合久久| 99久久精品免费看国产免费| 伊人久久综合精品无码AV专区| 久久无码精品一区二区三区| 久久99精品国产麻豆宅宅| 国内精品久久久久久99蜜桃| 久久91精品国产91久| 亚洲精品乱码久久久久久蜜桃 | 久久人人妻人人爽人人爽| 狠狠色丁香久久婷婷综合_中| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久久久久66精品片| 久久免费香蕉视频| 久久播电影网| 久久亚洲国产成人精品无码区| 精品久久久久久无码人妻蜜桃| AAA级久久久精品无码片| 精品国产福利久久久| 久久免费国产精品一区二区| 久久噜噜电影你懂的| 99久久免费国产精品| 久久99久久无码毛片一区二区| 久久精品国产一区二区三区不卡 | 午夜久久久久久禁播电影| 久久久老熟女一区二区三区| 国产精品99精品久久免费| 91麻豆精品国产91久久久久久| 国产亚洲美女精品久久久|