• <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,則進程不會退出,只是回到原來被中斷的地方繼續執行。
            久久九九全国免费| AV无码久久久久不卡蜜桃| 国产精品99久久久精品无码| 久久久久亚洲AV无码永不| 久久天天躁狠狠躁夜夜不卡| 久久这里的只有是精品23| 四虎国产精品成人免费久久| 久久这里只有精品视频99| 久久男人中文字幕资源站| 久久se精品一区精品二区国产| 7国产欧美日韩综合天堂中文久久久久 | 99久久精品久久久久久清纯| 久久久久亚洲av无码专区导航 | 国产精自产拍久久久久久蜜| 国产999精品久久久久久| 99久久精品影院老鸭窝| 99久久精品免费国产大片| 久久成人精品| 国内精品综合久久久40p| 青青草国产成人久久91网| 久久国产精品一区二区| 中文字幕亚洲综合久久菠萝蜜| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 97精品久久天干天天天按摩| 亚洲午夜精品久久久久久人妖| 久久精品国产亚洲AV不卡| 久久影院综合精品| 国产精品免费久久久久久久久| 亚洲欧美日韩久久精品| 精品久久久久久亚洲精品| 狠狠综合久久综合中文88| 久久亚洲AV无码精品色午夜麻豆 | 色婷婷久久久SWAG精品| 嫩草影院久久99| 久久本道综合久久伊人| 久久精品人人做人人爽97| 欧美日韩精品久久久免费观看| 亚洲∧v久久久无码精品| 国产成人精品综合久久久| 国内精品久久久久久久coent| 久久99久久99精品免视看动漫|