<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 175  文章 - 202  trackbacks - 0
    <2011年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    第一個Blog,記錄哈哈的生活

    常用鏈接

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    Java links

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    @import url(http://www.tkk7.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

    http://en.wikipedia.org/wiki/Category:Unix_signals

    1.SIGHUP信號

    UNIX中進程組織結構為 session (會話)包含一個前臺進程組及一個或多個后臺進程組,一個進程組包含多個進程。一個session可能會有一個session首進程,而一個session首進程可能會有一個控制終端。一個進程組可能會有一個進程組首進程。進程組首進程的進程ID與該進程組ID相等。這兒是可能會有,在一定情況之下是沒有的。與終端交互的進程是前臺進程,否則便是后臺進程。
    SIGHUP會在以下3種情況下被發送給相應的進程:
    1、終端關閉時,該信號被發送到session首進程以及作為job提交的進程(即用 & 符號提交的進程)
    2、session首進程退出時,該信號被發送到該session中的前臺進程組中的每一個進程
    3、若父進程退出導致進程組成為孤兒進程組,且該進程組中有進程處于停止狀態(收到SIGSTOP或SIGTSTP信號),該信號會被發送到該進程組中的每一個進程。
    統對SIGHUP信號的默認處理是止收到信號的程。所以若程序中沒有捕捉信號,當收到信號程就會退出。
    下面觀察幾種因終端關閉導致進程退出的情況,在這兒進程退出是因為收到了SIGHUP信號。login shell是session首進程。
    首先寫一個測試程序,代碼如下:
    #include <stdio.h>
    #include 
    <signal.h>
    char **args;
    void exithandle(int
     sig)
    {
            printf(
    "%s : sighup received ",args[1
    ]);
    }

    int main(int argc,char **argv)
    {
            args 
    =
     argv;
            signal(SIGHUP,exithandle);
            pause();
           
    return 0
    ;
    }
    程序中捕捉SIGHUP信號后打印一條信息,pause()使程序暫停。
    編譯后的執行文件為sigtest。
    1、命 令:sigtest front > tt.txt
       操 作:關閉終端
       結 果:tt.txt文件的內容為front : sighup received
       原 因: sigtest是前臺進程,終端關閉后,根據上面提到的第1種情況,login shell作為session首進程,會收到SIGHUP信號然后退出。根據第2種情況,sigtest作為前臺進程,會收到login shell發出的SIGHUP信號。
    2、命 令:sigtest back > tt.txt &
         操 作:關閉終端
          結 果:tt.txt文件的內容為 back : sighup received
          原 因: sigtest是提交的job,根據上面提到的第1種情況,sigtest會收到SIGHUP信號。
    3、命 令:寫一個shell,內容為[sigtest &],然后執行該shell
          操 作:關閉終端
          結 果:ps -ef | grep sigtest 會看到該進程還在,tt文件為空
          原 因: 執行該shell時,sigtest作為job提交,然后該shell退出,致使sigtest變成了孤兒進程,不再是當前session的job了,因此sigtest即不是session首進程也不是job,不會收到SIGHUP。同時孤兒進程屬于后臺進程,因此login shell退出后不會發送SIGHUP給sigtest,因為它只將該信號發送給前臺進程。第3條說過若進程組變成孤兒進程組的時候,若有進程處于停止狀態,也會收到SIGHUP信號,但sigtest沒有處于停止狀態,所以不會收到SIGHUP信號。
    4、命 令:nohup sigtest > tt
          操 作:關閉終端
          結 果:tt文件為空
          原 因: nohup可以防止進程收到SIGHUP信號
    至此,我們就清楚了何種情況下終端關閉后進程會退出,何種情況下不會退出。


    要想終端關閉后進程不退出有以下幾種方法,均為通過shell的方式:
    1、編寫shell,內容如下
           trap "" SIGHUP #該句的作用是屏蔽SIGHUP信號,trap可以屏蔽很多信號
          sigtest
    2、nohup sigtest 可以直接在命令行執行,
           若想做完該操作后繼續別的操作,可以 nohup sigtest &
    3、編寫shell,內容如下
           sigtest &
           其實任何將進程變為孤兒進程的方式都可以,包括fork后父進程馬上退出。

    2.SIGCHLD信號

           子進程死后,會發送SIGCHLD信號給父進程。

            一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數據結構(系統調用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進程的狀態中,僵尸進程 是非常特殊的一種,它已經放棄了幾乎所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態等信息供其他進程收集,除此之外,僵尸進程不再占有任何內存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信號處理函數調用wait或waitpid()等待子進程結束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態,如果這時父進程結束了,那么init進程自動會接手這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環,不會結束,那么子進程就會一直保持僵尸狀態,這就是為什么系統中有時會有很多的僵尸進程。

    2.SIGTERM信號

    kill() 可以發 SIGTERM 過去;kill 命令默認也使用 SIGTERM 信號。

    SIGTERM 信號的處理函數,常見的是用來清理、退出;或者程序可以忽略這個信號,以防誤殺。
            SIGTERM is the default signal sent to a process by the kill or killall commands. It causes the termination of a process, but unlike the SIGKILLsignal, it can be caught and interpreted (or ignored) by the process. Therefore, SIGTERM is more akin to asking a process to terminate nicely, allowing cleanup and closure of files. For this reason, on many Unix systems during shutdown, init issues SIGTERM to all processes that are not essential to powering off, waits a few seconds, and then issues SIGKILL to forcibly terminate other processes to allow the computer to halt.




    linux kill信號列表
    2009-04-13 17:00
    $ kill -l
    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
    5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
    9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
    13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD
    18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
    22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
    26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
    30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
    36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
    40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
    44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
    48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
    52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
    56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
    60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
    64) SIGRTMAX

    列表中,編號為1 ~ 31的信號為傳統UNIX支持的信號,是不可靠信號(非實時的),編號為32 ~ 63的信號是后來擴充的,稱做可靠信號(實時信號)。不可靠信號和可靠信號的區別在于前者不支持排隊,可能會造成信號丟失,而后者不會。

    下面我們對編號小于SIGRTMIN的信號進行討論。

    1) SIGHUP
    本信號在用戶終端連接(正常或非正常)結束時發出, 通常是在終端的控制進程結束時, 通知同一session內的各個作業, 這時它們與控制終端不再關聯。

    登錄Linux時,系統會分配給登錄用戶一個終端(Session)。在這個終端運行的所有程序,包括前臺進程組和后臺進程組,一般都屬于這個 Session。當用戶退出Linux登錄時,前臺進程組和后臺有對終端輸出的進程將會收到SIGHUP信號。這個信號的默認操作為終止進程,因此前臺進 程組和后臺有終端輸出的進程就會中止。不過可以捕獲這個信號,比如wget能捕獲SIGHUP信號,并忽略它,這樣就算退出了Linux登錄,wget也 能繼續下載。

    此外,對于與終端脫離關系的守護進程,這個信號用于通知它重新讀取配置文件。

    2) SIGINT
    程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出,用于通知前臺進程組終止進程。

    3) SIGQUIT
    和SIGINT類似, 但由QUIT字符(通常是Ctrl-\)來控制. 進程在因收到SIGQUIT退出時會產生core文件, 在這個意義上類似于一個程序錯誤信號。

    4) SIGILL
    執行了非法指令. 通常是因為可執行文件本身出現錯誤, 或者試圖執行數據段. 堆棧溢出時也有可能產生這個信號。

    5) SIGTRAP
    由斷點指令或其它trap指令產生. 由debugger使用。

    6) SIGABRT
    調用abort函數生成的信號。

    7) SIGBUS
    非法地址, 包括內存地址對齊(alignment)出錯。比如訪問一個四個字長的整數, 但其地址不是4的倍數。它與SIGSEGV的區別在于后者是由于對合法存儲地址的非法訪問觸發的(如訪問不屬于自己存儲空間或只讀存儲空間)。

    8) SIGFPE
    在發生致命的算術運算錯誤時發出. 不僅包括浮點運算錯誤, 還包括溢出及除數為0等其它所有的算術的錯誤。

    9) SIGKILL
    用來立即結束程序的運行. 本信號不能被阻塞、處理和忽略。如果管理員發現某個進程終止不了,可嘗試發送這個信號。

    10) SIGUSR1
    留給用戶使用

    11) SIGSEGV
    試圖訪問未分配給自己的內存, 或試圖往沒有寫權限的內存地址寫數據.

    12) SIGUSR2
    留給用戶使用

    13) SIGPIPE
    管道破裂。這個信號通常在進程間通信產生,比如采用FIFO(管道)通信的兩個進程,讀管道沒打開或者意外終止就往管道寫,寫進程會收到SIGPIPE信號。此外用Socket通信的兩個進程,寫進程在寫Socket的時候,讀進程已經終止。

    14) SIGALRM
    時鐘定時信號, 計算的是實際的時間或時鐘時間. alarm函數使用該信號.

    15) SIGTERM
    程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。

    17) SIGCHLD
    子進程結束時, 父進程會收到這個信號。

    如果父進程沒有處理這個信號,也沒有等待(wait)子進程,子進程雖然終止,但是還會在內核進程表中占有表項,這時的子進程稱為僵尸進程。這種情 況我們應該避免(父進程或者忽略SIGCHILD信號,或者捕捉它,或者wait它派生的子進程,或者父進程先終止,這時子進程的終止自動由init進程來接管)。

    18) SIGCONT
    讓一個停止(stopped)的進程繼續執行. 本信號不能被阻塞. 可以用一個handler來讓程序在由stopped狀態變為繼續執行時完成特定的工作. 例如, 重新顯示提示符...

    19) SIGSTOP
    停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別:該進程還未結束, 只是暫停執行. 本信號不能被阻塞, 處理或忽略.

    20) SIGTSTP
    停止進程的運行, 但該信號可以被處理和忽略. 用戶鍵入SUSP字符時(通常是Ctrl-Z)發出這個信號

    21) SIGTTIN
    當后臺作業要從用戶終端讀數據時, 該作業中的所有進程會收到SIGTTIN信號. 缺省時這些進程會停止執行.

    22) SIGTTOU
    類似于SIGTTIN, 但在寫終端(或修改終端模式)時收到.

    23) SIGURG
    有"緊急"數據或out-of-band數據到達socket時產生.

    24) SIGXCPU
    超過CPU時間資源限制. 這個限制可以由getrlimit/setrlimit來讀取/改變。

    25) SIGXFSZ
    當進程企圖擴大文件以至于超過文件大小資源限制。

    26) SIGVTALRM
    虛擬時鐘信號. 類似于SIGALRM, 但是計算的是該進程占用的CPU時間.

    27) SIGPROF
    類似于SIGALRM/SIGVTALRM, 但包括該進程用的CPU時間以及系統調用的時間.

    28) SIGWINCH
    窗口大小改變時發出.

    29) SIGIO
    文件描述符準備就緒, 可以開始進行輸入/輸出操作.

    30) SIGPWR
    Power failure

    31) SIGSYS
    非法的系統調用。

    在以上列出的信號中,程序不可捕獲、阻塞或忽略的信號有:SIGKILL,SIGSTOP
    不能恢復至默認動作的信號有:SIGILL,SIGTRAP
    默認會導致進程流產的信號有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
    默認會導致進程退出的信號有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
    默認會導致進程停止的信號有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
    默認進程忽略的信號有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH

    此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進程掛起時是繼續,否則是忽略,不能被阻塞。

    posted on 2011-08-16 11:55 哈哈的日子 閱讀(790) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 精品国产无限资源免费观看| 99在线视频免费| 黄色网址免费观看| 国产91久久久久久久免费| 亚洲伊人久久大香线蕉综合图片| 亚洲高清日韩精品第一区| 国产精品亚洲AV三区| 久久久久免费精品国产| 精品国产免费观看| 久久久亚洲欧洲日产国码农村| 亚洲中文字幕AV每天更新| 国产亚洲精品免费视频播放| 一个人在线观看视频免费| 亚洲色精品88色婷婷七月丁香| 精品亚洲国产成人| 中国内地毛片免费高清| 我想看一级毛片免费的| 亚洲精品成人片在线观看精品字幕| 亚洲中文字幕乱码一区| 久久永久免费人妻精品| 全黄a免费一级毛片人人爱| 亚洲欧洲国产精品久久| a毛看片免费观看视频| 国产美女精品久久久久久久免费| 久久精品国产亚洲av成人| 在线观看亚洲免费| 免费看黄视频网站| 亚洲va久久久噜噜噜久久天堂| 麻豆91免费视频| 国产v精品成人免费视频400条| 精品亚洲永久免费精品| 国产成人精品亚洲| 啦啦啦中文在线观看电视剧免费版| 亚洲AV无码成人精品区在线观看 | 国产成人精品日本亚洲专一区| 中文字幕版免费电影网站| 日韩视频在线免费| 亚洲国产日韩在线| 暖暖免费在线中文日本| 久久精品国产精品亚洲下载| 亚洲国产精品美女久久久久|