程序控制3 父子程序 恩怨情仇

2021-08-06 00:02:09 字數 3628 閱讀 3526

子程序比父程序先退出:殭屍程序

殭屍程序指的是那些雖然已經終止的程序,但仍然保留一些資訊,等待其父程序為其收屍。

如何產生?

如果乙個程序在其終止的時候,自己就**所有分配給它的資源,系統就不會產生所謂的殭屍程序了

殭屍程序產生的過程:

1. 父程序呼叫fork建立子程序後,子程序執行直至其終止,它立即從記憶體中移除,但程序描述符仍然保留在記憶體中(程序描述符占有極少的記憶體空間)。

子程序的狀態變成exit_zombie,並且向父程序傳送sigchld 訊號,父程序此時應該呼叫 wait() 系統呼叫來獲取子程序的退出狀態以及其它的資訊。在 wait 呼叫之後,殭屍程序就完全從記憶體中移除。

因此乙個殭屍存在於其終止到父程序呼叫 wait 等函式這個時間的間隙,一般很快就消失,但如果程式設計不合理,父程序從不呼叫 wait 等系統呼叫來收集殭屍程序,那麼這些程序會一直存在記憶體中。

子程序先父程序退出

#include 

#include

#include

#include

//子程序先父程序退出

int main()

}while(1);

return

0;}

在終端上執行後用ps -ef | grep a.out抓取程序,發現

多了十個殭屍程序,這就是父程序不處理子程序的後果,使用

killall a.out命令可以強制退出。

父程序先子程序退出

若父程序比子程序先終止,則該父程序的所有子程序的父程序都改變為init程序。我們稱這些程序由init程序領養。其執行順序大致如下:在乙個程序終止時,核心逐個檢查所有活動程序,以判斷它是否是正要終止的程序的子程序,如果是,則該程序的父程序id就更改為1(init程序的id);

有init領養的程序不會稱為僵死程序,因為只要init的子程序終止,init就會呼叫乙個wait函式取得其終止狀態。這樣也就防止了在系統中有很多僵死程序。

#include 

#include

#include

#include

//父程序先子程序退出

int main()

break;

default: //父程序

//printf ("我是父程序,id = %d\n", getpid());

//while(1);

exit(0);

break;

}return

0;}

這段**執行後就讓子程序一直跑在後台,不斷地往螢幕輸出「找爸爸」,需要在另乙個終端上關掉它

但是這個有很大的用處的,子程序跑在後台多麼像我們的軟體跑在後台,你是不是發現了什麼。

這裡我們就可以建立乙個守護程序:

#include 

#include

#include

#include

#include

#include

int daemonize(int nochdir, int noclose)

if (nochdir == 0)

}//關閉標準輸入,標準輸出,標準錯誤

close (stdin_fileno);

close (stdout_fileno);

close (stderr_fileno);

if (noclose == 0)

return0;}

int main()

wait()

#include 

pid_t wait(int

*status);

pid_t waitpid(pid_t pid, int

*status, int options);

//返回值:若成功返回程序id,若出錯返回-1。

呼叫wait或waitpid的程序可能發生的情況有:

如果所有子程序都還在執行,則阻塞(block)。

如果乙個子程序已終止,正等待父程序獲取其終止狀態,則取得該子程序的終止狀態立即返回。

如果它沒有任何子程序,則立即出錯返回。

在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞。

waitpid並不等待在其呼叫之後的第乙個終止的子程序。它有若干個選項,可以控制它所等待的程序。

如果乙個子程序已經終止,並且是乙個僵死程序,wait立即返回並取得該子程序的狀態,否則wait使其呼叫者阻塞直到乙個子程序終止。如果呼叫者阻塞並且它有多個子程序,則在其乙個子程序終止時,wait就立即返回。因為wait返回終止子程序的id,所以總能了解到是哪乙個子程序終止了。

注:僵死程序(zombie),乙個已經終止、但是其父程序尚未對其進行善後處理(獲得終止子程序的有關資訊,釋放它仍占用的資)的程序被稱為僵死程序。

有4個互斥的巨集可以用來獲取程序終止的原因:

wifexited(status)

若子程序正常終止,該巨集返回true。

此時,可以通過wexitstatus(status)獲取子程序的退出狀態(exit status)。

wifsignaled(status)

若子程序由訊號殺死,該巨集返回true。

此時,可以通過wtermsig(status)獲取使子程序終止的訊號值。

wifstopped(status)

若子程序被訊號暫停(stopped),該巨集返回true。

此時,可以通過wstopsig(status)獲取使子程序暫停的訊號值。

wifcontinued(status)

若子程序通過sigcont恢復,該巨集返回true。

waitpid

#include 

#include

pid_t waitpid (pid_t pid, int * status, int options)

//功能:會暫時停止目前程序的執行,直到有訊號來到或子程序結束

引數:如果不在意結束狀態值,則引數status可以設成null。

引數pid為欲等待的子程序識別碼:

pidpid=-1 等待任何子程序,相當於wait()。

pid=0 等待程序組識別碼與目前程序相同的任何子程序。

pid>0 等待任何子程序識別碼為pid的子程序。

引數option可以為0 或下面的or 組合

wnohang: 如果沒有任何已經結束的子程序則馬上返回,不予以等待。

wuntraced :如果子程序進入暫停執**況則馬上返回,但結束狀態不予以理會。

返回值:如果執行成功則返回子程序識別碼(pid),如果有錯誤發生則返回-1。失敗原因存於errno中。

unix linux多程序程式設計3 程序控制

1 程序組 1.1與同意作業關聯的乙個或者多個程序的集合稱為程序組,可以接收來自同一終端的各種訊號。可以用getpgrp 來或者程序的程序組id。1.2組長程序 每個程序組都有乙個組長程序,其標誌是程序id等於程序組id,組長程序可以建立乙個程序組,建立該組中的程序,然後終止。但組長程序終止,並不意...

程序及程序控制

學習程序之前,先了解一下程式 所謂程式就是指編譯好的二進位制檔案,在磁碟上,不占用系統資源 cpu 記憶體.而程序是與作業系統相關,是指在記憶體中執行起來的程式,占用一些系統資源,每當乙個程式執行,就相應產生乙個程序。程序的一些相關資訊被放在乙個叫程序控制塊的資料結構中,稱之為pcb。linux下的...

Demo3 程序控制

package test01 public class demo3 processcontrol 轉16進製制 16進製制 26 10 16 就是二進位制數每四位獲取 00011010 1a 16 怎麼獲取其實就是獲取四位中的1,通過與運算完成 要獲取夏四位,通過資料進行無符號位移方式 步驟 定義變...