1. 程式人生 > >程序概念之孤兒與殭屍

程序概念之孤兒與殭屍

      在瞭解了程序是什麼後,接下來我們來了解一下程序的其他相關。

      程序可以使用命令來進行檢視

  •   程序的資訊可以通過/proc系統資料夾檢視;(如要檢視PID為1 的程序資訊,需要檢視/proc/1這個資料夾)
  • 大多數程序資訊同樣也可以用top和ps這些使用者級工具來獲取

     通過系統呼叫獲取程序識別符號的方法:

     程序ID(PID):呼叫函式getpid();

     父程序ID(PPID):呼叫函式getppid();

     在學習過程序的建立和銷燬之後,我們應該會聽過孤兒程序與殭屍程序這兩個概念,接下來就來學習一下這兩個程序的概念以及來由。  孤兒程序與殭屍產生的方式均為kill+程序名(或者程序ID),若殺死的為父程序,則產生孤兒程序;若殺死的為子程序,則產生的為殭屍程序。

     殭屍程序:殭屍程序就是死後無人收屍,所以演變成殭屍,也就是,父程序還活著,但子程序因為某些原因而被殺死,然鵝父程序沒有得到子程序死亡的任何通知,所以該子程序就稱為殭屍程序。

  • 殭屍狀態是一個比較特殊的狀態。當程序退出並且父程序(使用wait()系統呼叫)沒有讀取到子程序退出的返回程式碼時就會產生殭屍程序。
  • 殭屍程序會以種植狀態保持在程序表中,並且會一直在等待父程序讀取退出程式碼。
  • 所有,只要子程序退出,父程序還在執行,但父程序沒有讀取子程序狀態,子程序進入Z狀態。

      下面我們就來模擬一下殭屍程序的產生。

#include<stdio.h>
#include<stdlib.h>

int main()
{
	pid_t id=fork();
	if(id<0)
	{
		perror("fork");
		return 1;
	}
	else if(id>0)
	{//parent
		printf("parent[%d] is sleeping...\n ",getpid());
		sleep(30);
	}
	else
	{
	    printf("child[%d] is begin Z....\n",getpid());
	    sleep(5);
	    exit(EXIT_SUCCESS);
	}
	return 0;
}

      測試結果:

         先執行縮寫程式碼:


         再開啟一個終端,建立一個監控命令列指令碼進行監控就可以觀察到程序的狀態:


      殭屍程序的危害:

  • 程序的退出狀態必須被維持下去,因為它要告訴關係它的程序(父程序),交給它的任務完成的怎麼樣了?可是如果父程序一直不讀取,那子程序就一直處於Z狀態。
  • 維持退出狀態本身就是要用資料維護,也屬於程序基本資訊,所有儲存在task_struct(PCB)中,也就是說,如果Z狀態一直不退出,PCB就要一直進行維護。
  • 但是你也知道,一個父程序會建立許多子程序,如果不回收,就會造成記憶體資源的浪費。因為資料結構物件本身就是就要佔用記憶體資源。

      孤兒程序:我們可以用字面意思來解釋,孤兒的意思就是無父無母,而我們都知道,程序只有父程序,所有孤兒程序的意思就是父程序已被銷燬,然鵝子程序依然存活,因此,我們把該子程序稱為孤兒程序。但,如父程序死後,所有的孤兒程序將由1號程序(也就是作業系統所提供的1號程序來管理),當然,前提是子程序不為殭屍程序。

  • 父程序如果提前退出,那麼子程序後退出,進入Z狀態後,該如何處理呢?
  • 父程序先退出,那麼子程序就稱為“孤兒程序”。
  • 孤兒程序被1號init程序收養,當然也要有init程序進行回收嘍。

    接下來進行孤兒程序的實現:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
	pid_t id=fork();
	if(id<0)
	{
		perror("fork");
		return 1;
	}
	else if(id==0)
	{//child
		printf("I'm child,pid:%d\n",getpid());
		sleep(10);
	}
	else
	{//parent
		printf("I'm parent,pid:%d\n",getpid());
		sleep(3);
		exit(0);
	}
	return 0;
}

     在監視命令列指令碼的監視下,執行結果如下:


  以上就是我對孤兒程序與殭屍程序的簡單總結。

相關推薦

程序概念孤兒殭屍

      在瞭解了程序是什麼後,接下來我們來了解一下程序的其他相關。      程序可以使用命令來進行檢視  程序的資訊可以通過/proc系統資料夾檢視;(如要檢視PID為1 的程序資訊,需要檢視/proc/1這個資料夾)大多數程序資訊同樣也可以用top和ps這些使用者級工

轉載:linux概念/proc/sys

其中 結構體 分層 scsi 內聯 聯系 tom 基於 是否 linux概念之/proc與/sys http://blog.chinaunix.net/uid-1835494-id-3070465.html   proc/x:1/sched http://bbs.chin

程序控制孤兒程序

#include<stdio.h> #include<sys/types.h> #include<sys/wait.h> #include<unistd.h> #include<signal.h>

js核心概念applycall

apply /** _layout: function (pjs, node, js) { var ar = [node]; for (var i = 0; i < js.lengt

孤兒程序殭屍程序

1、前言   之前在看《unix環境高階程式設計》第八章程序時候,提到孤兒程序和殭屍程序,一直對這兩個概念比較模糊。今天被人問到什麼是孤兒程序和殭屍程序,會帶來什麼問題,怎麼解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真

程序結束,其子程序不會結束,會掛到init程序孤兒程序殭屍程序[總結]

結論:一個父程序產生子程序,父程序結束(kill),子程序不會結束,子程序被init程序託管 下面是過程:     d.sh指令碼是一個ping命令,執行d.sh             &nb

孤兒程序殭屍程序[總結]

1、前言   之前在看《unix環境高階程式設計》第八章程序時候,提到孤兒程序和殭屍程序,一直對這兩個概念比較模糊。今天被人問到什麼是孤兒程序和殭屍程序,會帶來什麼問題,怎麼解決,我只停留在概念上面,沒有深入,倍感慚愧。晚上回來google了一下,再次參考APUE,認真總結一下,加深理解。 2、基本概念  

2.4 程序控制殭屍程序孤兒程序

學習目標:理解殭屍程序和孤兒程序形成的原因 一、孤兒程序 1. 孤兒程序: 父程序先於子程序結束,則子程序成為孤兒程序。子程序成為孤兒程序之後,init程序則會成為其新的父程序,稱為init程序領養孤兒程序。 2. 例程: 1 #include <stdio.h> 2 #incl

程序——孤兒程序殭屍程序

在學習程序時,一定會學到fork函式建立子程序,由此引出兩個概念: 孤兒程序 當父程序已經退出而子程序仍在執行時,此時子程序就相當於一個孤兒,即為孤兒程序。孤兒程序會立即被init程序(1號程

什麼是PHP7中的孤兒程序殭屍程序

什麼是PHP7中的孤兒程序與殭屍程序 基本概念 我們知道在unix/linux中,正常情況下,子程序是通過父程序建立的,子程

Linux程序管理1 程序概念作業系統基礎原理

計算機硬體層面之上是作業系統,狹義的作業系統主要指系統核心,核心有以下作用:程序管理、檔案系統、網路管理、記憶體管理、驅動程式、安

分布式緩存Ehcacheterracotta - Terracotta服務器概念

例如 信息 格式 基本 陣列 操作系統 rac 執行文件 高性能 1、介紹 Terracotta服務器為Terracotta產品提供分布式數據平臺。Terracotta服務器集群被稱為Terracotta服務器陣列(TSA)。Terracotta服務器陣列可以從單個服務器

J3. Java基本程序設計結構關鍵字標識符

內容 駝峰命名 要素 就是 意義 字母 trac 發現 說明   我們成功書寫了HelloWorld後,是否想過Java的程序都是又哪些部分組成的呢?這其實就是這章要研究的內容,本節先研究關鍵字與標識符,在標識符中我們也會講解一下Java中的駝峰命名; 1.1 關鍵字

Notes 20180508 : Java基本程序設計結構關鍵字標識符

void 數據 AS nat 序列 family 字節 重名 HA   我們成功書寫了HelloWorld後,又深入了解了main函數,提到過main並非是關鍵字,可什麽又是關鍵字呢?這其實就是這章要研究的內容,本節研究關鍵字與標識符,在標識符中我們也會講解一下Java中的

Notes 20180507 : Java程序設計環境搭建HelloWord

用戶 html 自己的 notes 添加 版本 devel demo 單選 3 HelloWorld     不管從事什麽工作那麽一個工作環境總是必不可少的,那怕你只是要寫篇文章,一張平坦的書桌和流利的書寫筆總是能幫助我們完成工作的,Java開發更是如此。在開始今天的He

支付寶小程序開發微信小程序不同的地方

示例代碼 調用 頁面 同步 get 沒有 小程序開發 bsp success 前言: 本文僅匯總微信小程序移植支付寶小程序過程中遇到的一些不同的地方,詳細請參考官方開發文檔。 網絡請求: 對於網絡請求,基本上改動不大,也就支付寶小程序沒有responseType屬性及

Linux高階程式設計基礎——程序 fork vfork 使用

程序之 fork 與 vfork 使用 編寫程式實現以下功能: 在父程序中定義變數n,在子程序中對變數n進行++操作;並且列印變數n的值,列印子程序pid; 在父程序中列印變數n的值,並且列印父程序pid。 要求分別用fork和vfork建立子程序。 #

linux程序管理概念(一)

一、程序和執行緒的概念 1.程序和執行緒的定義   程序並不只是一段可以執行的程式碼,也包含了執行程式碼所需要的資源。   在作業系統來看,程序是資源管理的最小單元,而我們又知道,執行緒是程式執行的最小單元。   話說回來,Linux系統至少有一個程序,一個程式可以對應多個程序,一個程序只能對應一個程

Linux 程序概念:>>

基本概念:>> 一.描述程序: 'PCB -- {描述程序}' Linux 下這個結構的名字叫做 task_struct 1.什麼是程序? :程序就是執行起來的一個程式 ,站在作業系統的角度下程序就是一個 PCB ,在 Linux 系統下用 結構體 task_st

Linux 學習筆記—程序通訊 訊息佇列、訊號量、共享記憶體的概念區別聯絡

2.5 訊息佇列(Message queues) 訊息佇列是核心地址空間中的內部連結串列,通過linux核心在各個程序直接傳遞內容,訊息順序地傳送到訊息佇列中,並以幾種不同的方式從佇列中獲得,每個訊息佇列可以用IPC識別符號唯一地進行識別。核心中的訊息佇列是通過