linux殭屍程序

2022-01-10 13:47:12 字數 1699 閱讀 8933

在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他, 那麼他將變成乙個殭屍程序.  在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝sigchld訊號處理函式呼叫 waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為殭屍程序。

下面我們寫乙個指令碼來模擬產生殭屍程序:

#include #include int main()

else if (pid == 0)

return 0;

}#生成執行檔案

[root@controller ~]# gcc zombie.c -o zombie

#執行[root@controller ~]# ./zombie

in parent process, sleep for one miniute...zz...

in child process, and exit!

#檢視使用 ps 等命令檢視系統中殭屍程序,殭屍程序的狀態標記為『z』:

[root@controller ~]# ps aux|grep defunct

root 83895 0.0 0.0 0 0 pts/0 z+ 20:37 0:00 [zombie] root 83909 0.0 0.0 112660 972 pts/1 s+ 20:38 0:00 grep --color=auto defunct

#如何殺死殭屍程序

[root@controller ~]# kill 83895

[root@controller ~]# ps aux|grep defunct

root 83895 0.0 0.0 0 0 pts/0 z+ 20:42 0:00 [zombie] root 83909 0.0 0.0 112660 972 pts/1 s+ 20:42 0:00 grep --color=auto defunct

#我們發現如果使用kill 【pid】 無法殺死殭屍程序,可以kill殭屍父程序。父程序死後,殭屍程序成為」孤兒程序」,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。

[root@controller ~]# ps -e -o ppid,stat|grep -e '[zz]'|awk ''|xargs kill -9

[root@controller ~]# ./zombie

in parent process, sleep for one miniute...zz...

in child process, and exit!

killed

處理sigchld訊號並不是必須的。但對於某些程序,特別是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序不等待子程序結束,子程序將成為殭屍程序(zombie)從而占用系統資源。如果父程序等待子程序結束,將增加父程序的負擔,影響伺服器程序的併發效能。在linux下 可以簡單地將 sigchld訊號的操作設為sig_ign。

signal(sigchld,sig_ign);這樣,核心在子程序結束時不會產生殭屍程序。這一點與bsd4不同,bsd4下必須顯式等待子程序結束才能釋放殭屍程序或者用兩次fork(),而且使緊跟的子程序直接退出,是的孫子程序成為孤兒程序,從而init程序將負責清除這個孤兒程序。

Linux 殭屍程序

怎樣產生殭屍程序的 乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序 zombie 的資料結構 系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀 在linux程序的狀態中,殭屍程序是非常特殊的...

linux殭屍程序

僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取得子程序的終止狀態。如果父程序沒有這麼做的話,子程序雖然已經退出了,但是在系統程序表中...

linux殭屍程序

殭屍程序是指子程序退出時,父程序並未對其發出的sigchild訊號進行適當處理,導致子程序停留在殭屍狀態等待其父程序為其收屍,這個狀態下的子程序就是殭屍程序。include include include int main int argc,char argv return 0 從上面的執行結果可以...