<nobr id="eeyoh"><big id="eeyoh"></big></nobr>

  • <button id="eeyoh"><acronym id="eeyoh"><cite id="eeyoh"></cite></acronym></button>

    <dd id="eeyoh"></dd>
    1. <dd id="eeyoh"><center id="eeyoh"></center></dd>

      <th id="eeyoh"></th>
      1. <span id="eeyoh"></span>
        更多課程 選擇中心

        嵌入式培訓
        達內IT學院

        400-111-8989

        嵌入式新手如何有效解決linux系統下的僵尸進程?

        • 發布:嵌入式培訓
        • 來源:嵌入式問答
        • 時間:2017-11-09 11:02

        嵌入式新手如何有效解決linux系統下的僵尸進程,下面是來自達內教育小編整理的關于解決僵尸進程的方法的總結。

        一、產生原因

        進程結束時都做些什么呢? 做這么幾件事情:

        1) 釋放資源,包括內存資源,文件標識符,數據庫連,設備資源等等

        2) 調用exit系統調用

        3) 修改進程表狀態為“僵死”狀態(Zombie),使用ps –el查看狀態為“Z”,進程表保存的信息包括:進程ID、進程狀態、運行時間等等

        4) 發送信號SIGHUP給父進程(除INIT進程外,其他進程都有父進程),等待其回收進程表資源

        因此進程結束之后,并沒有完全結束,而是進入了“僵死”狀態,等待父進程回收;

        父進程回收之前,僵死進程基本不占任何資源,僅僅占系統進程表的一個進程號和一條記錄,由于系統的進程號資源是有限的,如果系統產生大量的僵死進程,會導致系統無法產生新進程。

        二、查看方法

        ps –ely #S列為Z值的記錄

        #linux系統下,自動腳本

        ps –ely | gawk ‘$1==”Z”’

        或者

        ps –ef | grep “defunct” | grep –v “grep”

        復雜點的腳本:lZombie.sh

        cat lZombie.sh

        #look for processes of zombie state

        #get the position of “S” state

        i=1

        ps –ely| awk ‘NR==1’| while read line

        do

        if [ $line = “S” ]

        then

        break

        fi

        done

        #print the info of zombie processes

        ps –ely| awk ‘$”’$i’”==”Z”’

        #或者 ps –ely| awk ‘$’$i’==”Z”’

        三、處理方法

        1) 通知父進程子進程回收僵死進程

        Kill –s SIGCHLD PPID

        2) 如果確認父進程及其子進程已經“無用“,則直接殺死父進程及其子進程,INIT拖掛僵死進程后會自動清理之

        Kill –s SIGTERM PPID PID1 PID2

        或kill -15 PPID PID1 PID2

        四、如何避免

        1) 父進程通過wait或waitid等函數回收僵死子進程

        2) 子進程結束時,主動發送SIGCHLD信號給父進程,父進程在信號處理模塊調用wait函數

        3) 父進程不關心子進程什么時候結束,那么可以使用signal(SIGCHLD, SIG_IGN)通知內涵,父進程對子進程不感興趣,那么子進程結束后,內核直接回收;或者用sigaction函數為SIGCHLD信號設置SA_NOCLDWAIT:

        struct sigaction sa;

        sa.sa_handler = SIG_IGN;

        sa.sa_flags = SA_NOCLDWAIT;

        sigemptyset(&sa.sa_mask);

        sigaction(SIGCHLD, &sa, NULL);

        4) fork兩次,父進程fork一個子進程,然后繼續工作,子進程fork一個孫進程后退出,那么孫進程被init接管,孫進程結束后,init會回收。不過子進程的回收還要父進程來做。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:什么是嵌入式開發?
        下一篇:嵌入式系統如何選擇微控制器?

        嵌入式新手如何去自學嵌入式呢?

        嵌入式新手入門須知

        Linux系統中的”隊列”是什么?

        嵌入式新手如何學習嵌入式?

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        黑龍江省

        吉林省

        河北省

        湖南省

        貴州省

        云南省

        廣西省

        海南省

        中文第一社区天天射干20191024香蕉视频1024香蕉视频操逼逼网 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>