4.exec函式族:execl;execlp;execv
阿新 • • 發佈:2018-12-15
1.exec函式組
1.返回值:
如果函式執行成功,不返回
如果函式執行失敗,不需要判斷返回值:可以直接列印輸出,退出程式
2.exec函式族的[執行原理]
能夠[替換]程序地址空間的[程式碼段.text]
使用場景:
1.執行一個另外的程式不需要建立額外的地址空間
2.一個執行的程式a,想呼叫另外的應用程式b
2.函式介紹
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
[1] execl
int execl(const char *path, const char *arg, ...); path:可執行程式(絕對路徑) 變參arg:要執行的程式需要的引數 第一arg:佔位 # 可以隨便寫 後邊的arg:命令的引數 引數寫完之後:NULL結尾 例: execl("/bin/ls","666","-lah",NULL);
[2] execlp
int execlp(const char *file, const char *arg, ...); //p表示的含義是:PATH環境變數
execlp與execl不同點:
執行PATH環境變數能夠搜尋到的程式,引數file只需要寫(執行命令的名字)
[3] execv
int execv(const char *path, char *const argv[]);
引數:
path=/bin/ps #命令
char* args[]={"ps","aux",NULL}; //
使用:
execv("/bin/ps",args);
3.綜合案例
int main(){ for(int i=0;i<3;i++) printf("i = %d\n",i); pid_t pid = fork(); //建立子程序 if(pid<0){ perror("fork fail"); exit(1); } if(pid==0){ //在子程序中執行execl函式 sleep(1); execl("/bin/ls","666","-lah",NULL); // 1 execl /* execlp("ls","666","-lah",NULL); // 2 execlp */ /* char* buf[]={"ls","-lah",NULL}; execv("/bin/ls",buf); // 3 execv */ perror("execv"); exit(1); } for(int i=0;i<3;i++) printf("__________i = %d\n",i); return 0; } 執行結果: [
[email protected] 3-exec]$ ./ls i = 0 i = 1 i = 2 __________i = 0 __________i = 1 __________i = 2 [[email protected] 3-exec]$ 總用量 16K drwxr-xr-x. 2 gjw gjw 31 10月 13 19:43 . drwxr-xr-x. 5 gjw gjw 51 10月 13 19:20 .. -rw-rw-r--. 1 gjw gjw 455 10月 13 19:45 execl.c -rwxrwxr-x. 1 gjw gjw 8.5K 10月 13 19:43 ls