1. 程式人生 > >Linux 下 popen 函式引起的殭屍程序 defunct 以及解決辦法

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() 函式也可以解決該問題,我沒有去嘗試,有興趣的朋友可以嘗試一下,也希望一起分享結果。

參考:

博主所有文章已轉自私人部落格 Joe 的個人部落格

,謝謝關注!

相關推薦

Linux popen 函式引起殭屍程序 defunct 以及解決辦法

        在使用 popen 函式的時候,如果不注意的話,可能會引起殭屍程序 defunct 的存在,雖然該程序不佔用記憶體和 CPU,但是會在程序任務管理樹上佔用一個寶貴的節點。這樣就造成了程序名額的資源浪費,所以一定得處理殭屍程序! 下面以 python 為例來

LinuxQt5.6 Fcitx無法輸入中文輸入解決辦法

pos 版本 linux text git eat tor blog nal Qt5.6的解決辦法和之前的版本有點不同,方法如下:首先安裝 fcitx-frontend-qt5。然後執行: 123 sudo cp /usr/lib/x86_6

linux掛在ntfs掛載報錯問題解決辦法

gre 查看 安裝包 ntfs ref iyu epel 。。 make linux下掛在NTFS格式設備會掛載不了,很大一部分原因是因為沒有NTF驅動,現在說的就是沒有驅動而掛載不了的解決辦法,在linux下安裝ntfs-3g驅動,就可以掛載了,先下載r安裝包,今天直接說

Linux找不到so文件的解決辦法

ldconfig -name desktop 末尾 添加 文件搜索 libjson 出現 技術 http://www.cnblogs.com/xudong-bupt/p/3698294.html 如果使用自己手動生成的動態鏈接庫.so文件,但是這個.so文件,沒有加入庫文

問題記錄之關於linuxshutdown關閉不掉tomcat問題的解決辦法

關於linux下shutdown關閉不掉tomcat問題的解決辦法解決問題的辦法: 方法二:強制殺程序 1.找到tomcat下bin/catalina.sh檔案,vi進去新增點東西,主要是記錄tomcat的pid,如下: #設定CATALINA_PID(後加) if [ -z "$CATALINA_P

Linux啟動監聽配置圖形介面出錯解決辦法

錯誤資訊如下: Xlib: connection to ":0.0" refused by server Xlib: No protocol specified 解決辦法: 在linux系統中用Oracle帳號執行DBCA或其他JAVA圖形介面程式時,報錯: Xlib: c

linux 火狐瀏覽器不能播放flash 的解決辦法

首先你需要去官網下載flash 下載.tar.gz版本 然後解壓 tar -zxvf xxxxx.tar.gz 解壓之後只你會看到一個libflashplayer.so檔案 現在新建一個目錄 ~$ mkdir -p ./.mozilla/plugin

Linux安裝mysql5.6.42報錯處理解決辦法

linux下安裝mysql的教程炒雞多,我就不寫了,自行百度。 說一下我今天安裝遇到的問題: 1、執行 ./scripts/mysql_install_db --user=mysql 後 報 FATAL

linux由於系統編碼問題造成亂碼的解決辦法

  下面介紹一下由於linux系統編碼設定不正確造成潤乾報表應用亂碼問題的解決辦法。 第一步:檢查linux的系統編碼。 檢查linux的系統編碼,確定系統是否支援中文。在linux系統的終端中輸入命令:locale,就會看到打印出的系統編碼資訊。如果打印出來的資訊如下,則

Linux操作mysql的常用語句,以及解決在putty中不能夠輸入中文的問題

前言,伺服器買了一個Linux作業系統,接下來就和命令列分不開了,對於在命令列 中操作mysql還沒有多少經驗,在網上找了幾個文章看了,在這裡來總結以後 注意在資料庫中的操作一定都要以分號(;)結尾

linuxmysql中文亂碼(中文問號)解決辦法

今天發現我mysql插入中文時老出現????號了,但儲存英文是沒有問題的,下面我來給各位同學介紹一下linux下mysql中文亂碼解決方法。 linux下則需要修改/etc/my.cnf,在[mysqld]下加入default-character-set = utf8,[client]下加入defaul

LinuxTCP連線斷開後不釋放的解決辦法

問題:在開發測試時發現斷開與伺服器埠後再次連線時拒絕連線。 分析:伺服器上檢視端口占用情況,假設埠為8888。 netstat -anp |grep 8888 發現埠8888埠顯示被佔用(ip為本機ip確定是上次連線)且狀態為ESTABLISHED,然而實際上連線已經斷

win10(64位)安裝tesseract和tesserocr出現問題以及解決辦法

tesserocr是Python的一個OCR識別庫,但其實是對tesseract做的一層Python API封裝,所以它的核心是tesseract。因此,在安裝tesseroct之前,我們必須安裝tesseract。 tesseract安裝              

linux殭屍程序(Defunct程序)的產生與避免

在測試基於 DirectFB+Gstreamer 的視訊聯播系統的一個 Demo 的時候,其中大量使用 system 呼叫的語句,例如在 menu 程式碼中的 system("./play") ,而且多次執行,這種情況下,在 ps -ef 列表中出現了大量的 defunct 程序,對程式的執行時有害

linux 殭屍程序defunct ps auxf

當我們在程式中使用popen或者fopen時,容易出現殭屍程序。原因可能是沒有fclose或者pclose,或者其他原因。 當我們ps auxf檢視時,就能看到 如下 root     29587  0.0  0.0 117280  3580 ?        S    1

LinuxPCI設備驅動程序開發 --- PCI驅動程序實現(三)

傳輸 char rep roc register case 負責 ava b- 三、PCI驅動程序實現 1. 關鍵數據結構 PCI設備上有三種地址空間:PCI的I/O空間、PCI的存儲空間和PCI的配置空間。CPU可以訪問PCI設備上的所有地址空間,其中I/O空間和存儲空間

linux安裝微信小程序開發工具

微信 down 工具 -c 程序開發 使用 linux下 devtools 過程 一.環境:: ubuntu 16.04 二.安裝過程: 2.1 去微信官網獲取最新的windows64位版本的微信開發工具 https://servicewechat.com/wxa-dev-

Linux使用vim編輯c程序

添加 vim常用命令 系統管 默認安裝 根據 我們 向上 說明 字符串 這幾天在系統能力班自學linux,加上最近大數據課上開始使用linux,我在這裏總結一下,linux下使用vim編輯c語音程序的一些問題。 大數據課上是直接使用micro來編輯的,我這裏只是簡單的說明

Linux實現指令碼監測特定程序佔用記憶體情況

記憶體洩露是C/C++程式設計師經常需要面對的問題,除了有效地經常查找出記憶體洩露的位置外,在嵌入式的開發中,還經常需要確定自己寫的程式是否存在記憶體洩露的情況 Linux系統下,我們可以利用以下命令來獲取特定程序的執行情況: cat /proc/$PID/status 其中

c語言實現linux高危函式system (簡易V1.0版本)

system這個函式真的是要慎用,一不小心就會留下漏洞。 下面是用c語言簡易的實現了一下system函式 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<err