1. 殭屍程序
說明子程序結束但是沒有完全釋放記憶體(在核心中的task_struct沒有釋放),該程序就會成為殭屍程序
當殭屍程序的父程序結束後就會被init程序(1號程序)接管,最終被**
殭屍程序的危害
如果你不處理殭屍程序的話,那麼保留的那段資訊就不會釋放,其程序號就會一定被占用,但是系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序
避免殭屍程序
讓殭屍程序的父程序來**,父程序每隔一段時間來查詢子程序是否結束並被**,呼叫wait或者waitpid函式,通知核心釋放殭屍程序
採用訊號sigchld通知處理,並在訊號處理程式中呼叫wait函式
讓殭屍程序成為孤兒程序,並有init程序**
2.避免殭屍程序方法一說明
#include
#include
2. wait函式
原型:pid_t wait(int *status)
返回:成功返回子程序id,出錯返回-1
作用:等待子程序退出並**,防止殭屍程序產生
3. waitpid函式
原型:pid_t waitpid(pid_t pid, int *status, int options)
返回:成功返回子程序id,出錯返回-1
功能:wait函式的非阻塞版本
pid引數:
pid == -1:等待任一子程序,與功能 wait 相等
pid > 0:等待其程序id與 pid 相等的子程序
pid == 0:等待其組id等於呼叫程序的組id的任一子程序
pid < -1:等待其組id等於 pid 的絕對值的任一子程序
4. 示例
#include
#include
#include
#include
#include
#include
void out_status(int status)
else
if(wifsignaled(status))
else
if(wifstopped(status))
else
}int main(void)
else
if(pid == 0)
//父程序阻塞,等待子程序結束並**
wait(&status);
out_status(status);
printf("--------------------------\n");
if((pid = fork()) < 0)
else
if(pid == 0)
wait(&status);
out_status(status);
printf("--------------------------\n");
if((pid = fork()) < 0)
else
if(pid == 0)
do}while(pid == 0);
out_status(status);
return
0; }
Linux系統wait 和waitpid 函式
include include pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wa...
wait函式和waitpid函式
1 wait函式 當乙個程序結束時,會關閉所有的檔案描述符,釋放所有的記憶體空間,但依然儲存其pcb,核心在pcb中儲存著一些資訊。如果是正常退出,則會儲存退出狀態。如果是異常終止,則儲存是哪個訊號終止了該程序。父程序通過呼叫wait 或者waitpid 函式,來獲取這些資訊,之後徹底清除改程序。只...
wait和 wait pid函式用法
wait和 wait pid函式用法 wait的函式原型是 i nclude 提供型別pid t的定義 i nclude pid t wait int status 程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序...