wait函式和waitpid函式

2021-08-08 03:28:53 字數 1610 閱讀 3046

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自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序...