1. 程式人生 > >linux程序-exec函式族

linux程序-exec函式族

補充一下exec函式族:首先回顧一下
fork函式是用於建立一個子程序,該子程序幾乎是父程序的副本,而有時我們希望子程序去執行另外的程式,exec函式族就提供了一個在程序中啟動另一個程式執行的方法。

int execl(const char *path, const char *arg, ...)
int execv(const char *path, char *const argv[])
int execle(const char *path, const char *arg, ..., char *const envp[])
int execve(const char *path, char *const argv[], char *const envp[])
int execlp(const char *file, const char *arg, ...)
int execvp(const char *file, char *const argv[])

首先,前四個函式取path路徑名作為引數,後兩個取file;檔名作為引數。
第二引數表的傳遞:l表示列表,v表示向量。帶l的三個函式,要求將新程式的每個命令列引數都說明為一個單獨的引數。其它三個函式,則應該構造一個指向各引數的指標陣列,將該陣列作為這些函式的引數。下面例程,你會看到這種區別的。
最後,帶e的函式,可以傳遞一個指向環境字串指標陣列的指標,一般不用給NULL作為引數。

一點記憶的小技巧:p字元表示該函式去filename做引數。l表示該函式取一個引數表與字母v是互斥的。v表示取一個argv[]向量。字母e表示該函式取envp[]陣列,而不使用當前環境。

一個使用6個函式的例程

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



int main()
{
	
	char *argv1[]={"hello","NULL"};                                 //隨便寫一個hello.c的小程式,用來呼叫
	char *argv2[]={"ls","-l","NULL"};                               //小知識:linux下的命令其實也是相當於一個程式
	
	if(fork()==0){                                                  //子程序1,呼叫execl函式執行hello程式
		if(execl("/home/hello","hello",NULL)<0){
			perror("execl err");
			exit(1);
		}
		
		
	}
	
	if(fork()==0){                                                 //子程序2,呼叫execv函式執行hello程式
		if(execv("/home/hello",argv1)<0){
			perror("execv err");
			exit(1);
		}
		
		
	}
	
	if(fork()==0){                                                 //子程序3,呼叫execlp函式執行ls程式
		if(execlp("ls","ls","-l",NULL)<0){
			perror("execlp err");
			exit(1);
		}
		
		
	}
	
	if(fork()==0){                                                 //子程序4,呼叫execvp函式執行ls程式
		if(execvp("ls",argv2)<0){
			perror("execvp err");
			exit(1);
		}
		
		
	}
	
	if(fork()==0){                                                 //子程序5,呼叫execle函式執行ls程式
		if(execle("/bin/ls","ls","-l",NULL,NULL)<0){
			perror("execle err");
			exit(1);
		}
		
		
	}
	
	if(fork() == 0){                                             //子程序6,呼叫execve函式執行ls程式
		
		if(execve("/bin/ls",argv2,NULL) <0){
			perror("execve error");
			exit(1);
		}
	}

	return 0;

}

你可以看到,帶l的函式每個命令列引數都是單獨說明的。