1. 程式人生 > >4.exec函式族:execl;execlp;execv

4.exec函式族:execl;execlp;execv

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