程序控制 殭屍程序 孤兒程序 execv函式族
殭屍程序:
子程序退出,父程序不為子程序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);
}
標頭檔案