Linux 下 popen 函式引起的殭屍程式 defunct 以及解決辦法
在使用 popen 函式的時候,如果不注意的話,可能會引起殭屍程式 defunct 的存在,雖然該程式不佔用記憶體和 CPU,但是會在程式任務管理樹上佔用一個寶貴的節點。這樣就造成了程式名額的資源浪費,所以一定得處理殭屍程式!
下面以 python 為例來說明:
python 指令碼如下(zombie.py):
#!/usr/bin/env python
#-*-encoding:UTF-8-*-
import os
import time
import subprocess
if __name__ == '__main__':
p = subprocess.Popen('ls',shell=True,close_fds=True,bufsize=-1,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
file = p.stdout.readlines()
for i in range(0, len(file)):
print file[i]
#end for
while True:
time.sleep(1)
#end while
#end if
執行結果如下:
我們用 top 命令檢視此時有沒有殭屍程式,結果如下:
用 ps axf 命令檢視具體的殭屍程式,結果如下:
檢視相關資料後發現,在使用 popen 函式後,需要呼叫 wait 函式(等待子程式中斷或結束),否則就會產生殭屍程式,於是上面的程式碼做了簡單修改
#!/usr/bin/env python
#-*-encoding:UTF-8-*-
import os
import time
import subprocess
if __name__ == '__main__':
p = subprocess.Popen('ls',shell=True,close_fds=True,bufsize=-1,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
file = p.stdout.readlines()
p.wait() # 新增 wait 函式
for i in range(0, len(file)):
print file[i]
#end for
while True:
time.sleep(1)
#end while
#end if
執行結果不變,但是使用 top 名令檢視殭屍程式的個數,結果如下:
使用 ps axf 命令檢視結果如下:
並無殭屍程式。
介紹下 wait() 函式的功能:
wait() 會暫時停止目前程式的執行,直到有訊號來到或子程式結束。如果在呼叫 wait() 時子程式已經結束,則 wait() 會立即返回子程式結束狀態值。子程式的結束狀態值會由引數 status 返回,而子程式的程式識別碼也會一快返回。
有些資料也說 waitpid() 函式也可以解決該問題,我沒有去嘗試,有興趣的朋友可以嘗試一下,也希望一起分享結果。
參考:
http://www.csdn123.com/html/blogs/20130619/23994.htm
博主所有文章已轉自私人部落格 Joe 的個人部落格,謝謝關注!
相關文章
- Openstack的error殭屍例項的解決辦法Error
- Linux 中殭屍程式詳解Linux
- Linux 殭屍程式Linux
- Linux系統殭屍程式詳解Linux
- 檢視 Linux 殭屍程式Linux
- Linux殭屍程式處置Linux
- defunct僵死程式解決方法
- 殭屍程式
- popen函式函式
- Linux中殭屍程式是什麼意思?怎麼檢視殭屍程式?Linux
- handlder引起的記憶體洩漏問題以及解決辦法記憶體
- Linux下使用Matlab符號函式出錯的解決辦法(轉)LinuxMatlab符號函式
- Linux 系統中殭屍程式Linux
- Linux如何殺掉殭屍程式Linux
- 什麼是殭屍程式以及如何處理
- 殭屍程式,孤兒程式,wait,exit,execl等函式使用要點AI函式
- 什麼是殭屍程式,如何找到並殺掉殭屍程式?
- fork和殭屍程式
- 【系統】 殭屍程式
- 殺死殭屍程式
- 殭屍程式,孤兒程式
- 關於LINUX殭屍程式的出現和原理Linux
- Spark on mesos的坑以及解決辦法Spark
- 殭屍程式和孤兒程式
- Linux 效能優化之 CPU 篇 ----- 殭屍程式Linux優化
- Linux程式管理、程式建立、執行緒實現、殭屍程式Linux執行緒
- Oracle沒有WM_CONCAT函式的解決辦法Oracle函式
- Linux下flash player無法全屏看影片的解決辦法!Linux
- Perl程式:殭屍程式和孤兒程式
- Linux上的殭屍跑得比Windows快LinuxWindows
- 子程式、孤兒程式,殭屍程式, init程式
- Oracle死鎖的檢視以及解決辦法Oracle
- rootkits病毒的原理介紹以及解決辦法
- Go Exec 殭屍與孤兒程式Go
- 檢視並殺死殭屍程式
- Linux系統下ssh登陸很慢的解決辦法Linux
- Linux下rpm包相互依賴的解決辦法Linux
- Linux下安裝oracle,遇到錯誤的解決辦法LinuxOracle