子程序比父程序先退出:殭屍程序
殭屍程序指的是那些雖然已經終止的程序,但仍然保留一些資訊,等待其父程序為其收屍。
如何產生?
如果乙個程序在其終止的時候,自己就**所有分配給它的資源,系統就不會產生所謂的殭屍程序了
殭屍程序產生的過程:
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個互斥的巨集可以用來獲取程序終止的原因:waitpidwifexited(status)
若子程序正常終止,該巨集返回true。
此時,可以通過wexitstatus(status)獲取子程序的退出狀態(exit status)。
wifsignaled(status)
若子程序由訊號殺死,該巨集返回true。
此時,可以通過wtermsig(status)獲取使子程序終止的訊號值。
wifstopped(status)
若子程序被訊號暫停(stopped),該巨集返回true。
此時,可以通過wstopsig(status)獲取使子程序暫停的訊號值。
wifcontinued(status)
若子程序通過sigcont恢復,該巨集返回true。
#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,通過與運算完成 要獲取夏四位,通過資料進行無符號位移方式 步驟 定義變...