linux程序-exec函式族
阿新 • • 發佈:2019-02-05
補充一下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的函式每個命令列引數都是單獨說明的。