天天看點

多程序之程序資源回收wait,wiatpid函數程序之資源回收:

程序之資源回收:

(1)在程序結束後隻是把占用的記憶體釋放掉而已,但是一些系統資源依舊被占用着

(2)我們需要把系統所配置設定給程序的資源進行回收,否則程序在運作結束後會變成僵屍狀态等待系統在一定的時候再去回收程序的資源;

(3)我們可以為了避免死掉的程序一直占用着系統資源,我們可以在程序執行結束前把它所占有的系統資源給回收

程序回收資源相關函數:
//頭檔案
#include <sys/wait.h>
#include <sys/types.h>

//函數原型
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);


//函數介紹
/****************************************************
函數作用:用于回收程序運作結束後的系統資源

函數形參:
		status:用于儲存程序退出時的狀态,一般不在乎進出退出狀态NULL
(擷取到的退出狀态不僅僅為程序退出狀态值,還包括了是否為正常退出或者其他原因退出等資訊,程序退出狀态值儲存在8-16位)
	
		pid	: 輸入參數有
				-1,等待任意一個子程序
			  	>0,ID号為pid,指定需要等待回收的子程序id号
		
		options:
			0:阻塞等待(此時與wait相似)
			WNOHANG :不阻塞等待程序的退出,若此時沒有已退出程序則直接傳回
			WUNTRACED:如果子程序進入暫停執行情況則馬上傳回, 但結束狀态不予以理會. 子程序的結束狀态傳回後存于status, 底下有幾個宏可判别結束情況
			WIFEXITED(status):如果子程序正常結束則為非0 值.
			WEXITSTATUS(status):取得子程序exit()傳回的結束代碼, 一般會先用WIFEXITED 來判斷是否正常結束才能使用此宏.
			WIFSIGNALED(status):如果子程序是因為信号而結束則此宏值為真
			WTERMSIG(status):取得子程序因信号而中止的信号代碼, 一般會先用WIFSIGNALED 來判斷後才使用此宏.
			WIFSTOPPED(status):如果子程序處于暫停執行情況則此宏值為真. 一般隻有使用WUNTRACED時才會有此情況.
			WSTOPSIG(status):取得引發子程序暫停的信号代碼, 一般會先用WIFSTOPPED 來判斷後才使用此宏.

函數傳回值:
			成功:
				wait:被回收子程序ID号
				waitpid:
					0:當option使用WNOHANG,表示沒有已退出的子程序
					>0:被回收資源的程序号
			失敗: -1
***************************************************/

           
測試代碼:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>


int main(int argc, const char **argv)
{
	//建立一個子程序
	pid_t id = fork();
	if(id == -1)
	{
		perror("fork failed!");
		return -1;
	}
	else if(id == 0) //子程序裡面的傳回值是等于0
	{
		printf("I AM a child!\n");
		printf("child:%d\n", getpid()); //擷取自己ID号
		
		exit(230);
	}
	else if(id > 0) //父程序傳回值大于0的
	{
		sleep(2);
		printf("I AM a parent!\n");

		//回收子程序資源--》不阻塞等待
		int status;
		
		//wait(&status);//使用wait函數回收程序資源,會阻塞等待程序退出
		int ret = waitpid(-1, &status, WNOHANG);
		if(ret == -1) //執行失敗
		{
			perror("wait pid failed!\n");
			
		}
		else if(ret == 0)
		{
			printf("此時沒有已退出的子程序!\n");
		}
		else //回收子程序資源成功,列印被回收子程序ID号
		{
			printf("被回收資源的子程序ID号ret:%d\n", ret);
			printf("status:%d\n", (0xff00 & status) >> 8); //列印退出值
			printf("status:%#x\n", status);//列印存放狀态的十六進制數,看狀态值是否存放在8-16位
			printf("status:%d\n", WEXITSTATUS( status)); //列印退出值
			
		}
	
	}

	return 0;
}

           

運作結果:

多程式之程式資源回收wait,wiatpid函數程式之資源回收:

總結:

(1):wait函數會等待系統中的某一個程序退出然後回收它的資源,但是如果我們想指定回收某一程序的資源,隻能使用waitpid函數

(2)建議一般情況下能用waitpid則用waitpid;因為使用wait函數的話,若此時系統有其他程序退出,則wait函數就會直接傳回,而waitpid可以指定等待某一程序的退出

繼續閱讀