1. 程式人生 > 其它 >程序控制 殭屍程序 孤兒程序 execv函式族

程序控制 殭屍程序 孤兒程序 execv函式族

技術標籤:筆記linux

殭屍程序:

子程序退出,父程序不為子程序wait(釋放子程序的資源)
問:為什麼需要父程序來為子程序釋放資源
父子程序是兩個不同的程序(獨立的空間),父需要需要得到子程序的退出狀態,所以需要父程序來釋放
問:如何釋放
父程序呼叫wait來釋放。

程式碼實現

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
void main()
{
	int pid=fork();
	if(pid>0)//父程序
	{
		printf
("父程序:%d,睡眠40s\n",getpid()); sleep(40); printf("父程序醒了...\n"); wait(NULL); sleep(100); } else if(pid==0)//子程序 { printf("子程序:%d,執行結束\n",getpid()); exit(0); } }

孤兒程序:

父程序先於子程序退出
(應用於精靈程序/守護程序/後臺程序)
PS:由於父程序先於子程序退出,所以該子程序的父程序成為1號程序,該子程序退出後就會向1號程序傳送退出訊號,1號程序收到就會釋放資源。

程式碼實現

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>


void main()
{
	int pid=fork();
	if(pid>0)//父程序
	{
		printf("我是父程序:%d,即將退出....\n",getpid());
		exit(0);					
	}
	else if(pid==0)
	{
		printf("我是子程序:%d\n",getpid());
		sleep(1);
		printf("我是子程序:%d,我的父程序:%d\n"
,getpid(),getppid()); } }

ps檢視程序
ps -e檢視程序列表

execv函式族:

用於執行指定的可執行檔案
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg,
…, char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

PS:
1、
帶有p字尾,從系統路徑下執行檔案可執行檔案

	//系統路徑下, 帶p
	printf("我是execl的程式\n");
	//execlp("ls","ls","/",NULL);
	//char* argv[] ={"ls","-l","/",NULL};
	char* argv[] ={"mytest","mytest",NULL};
	execvp("./mytest",argv);
	printf("我執行結束啦\n");

不帶有p字尾,從使用者指定路徑執行,若不指定路徑則去系統路徑下查詢,若指定路徑則從指定路徑下查詢。

	printf("我是execl的程式\n");
	//執行mytest
	execl("./mytest","mytest",NULL);
	printf("我執行結束啦\n");

2、
帶v字尾:執行可執行檔案的使用者引數列表通過陣列傳遞,陣列元素的最後一個元素必須是NULL
帶l字尾:通過可變形參傳遞,最後一個形參必須是NULL
3、
若上述函式執行可執行檔案成功時,就會將該可執行檔案的程式替換本進位制的程式程式碼區
4、
若該程序不被可執行檔案替換,可以交給子程序執行。

	int pid=fork();
	if(pid>0)//父程序
	{
		printf("我是父程序,執行ls命令\n");	
		//等待子程序
		wait(NULL);
		printf("我執行結束啦\n");
		
	}
	else if(pid==0)//子程序
	{
		//為什麼需要交給子程序來執行ls命令,只會替換子程序空間
		execlp("ls","ls","-l","/",NULL);
	}

標頭檔案
在這裡插入圖片描述