exec函數族實例解析


fork()函數通過系統調用創建一個與原來進程(父進程)幾乎完全相同的進程(子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味着父子進程間不共享這些存儲空間。linux將復制父進程的地址空間內容給子進程,因此,子進程有了獨立的地址空間。),也就是這兩個進程做完全相同的事。

在fork后的子進程中使用exec函數族,可以裝入和運行其它程序(子進程替換原有進程,和父進程做不同的事)。

fork創建一個新的進程就產生了一個新的PID,exec啟動一個新程序,替換原有的進程,因此這個新的被 exec 執行的進程的PID不會改變(和調用exec的進程的PID一樣)。

exec函數族:

 1 #include <unistd.h>
 2 extern char **environ;  3 int execl(const char *path,  4           const char *arg, ...);  5 int execlp(const char *file,  6            const char *arg, ...);  7 int execle(const char *path,  8            const char *arg,  9  ..., 10            char * const envp[]); 11 int execv(const char *path, 12           char *const argv[]); 13 int execvp(const char *file, 14            char *const argv[]); 15 int execve(const char *file, 16             char *const argv[], 17             char *const envp[]);

 exec函數族裝入並運行程序path/file,並將參數arg0(arg1, arg2, argv[], envp[])傳遞給子程序,出錯返回-1.

在exec函數族中,后綴l、v、p、e指定函數將具有某種操作能力:

后綴 操作能力
l 希望接收以逗號分隔的參數列表,列表以NULL指針作為結束標志
v 希望接收到一個以NULL結尾的字符串數組的指針
p 是一個以NULL結尾的字符串數組指針,函數可以DOS的PATH變量查找子程序文件
e 函數傳遞指定參數envp,允許改變子進程的環境,無后綴e時,子進程使用當前程序的環境
   
   
   
   
   

 

 具體例子:

  1 #ifdef HAVE_CONFIG_H
  2 #include <config.h>
  3 #endif
  4 
  5 #include <stdio.h>
  6 #include <stdlib.h>
  7 #include <unistd.h>
  8 #include <string.h>
  9 #include <errno.h>
 10 
 11 int main(int argc, char *argv[])
 12 {
 13   //以NULL結尾的字符串數組的指針,適合包含v的exec函數參數
 14   char *arg[] = {"ls", "-a", NULL};
 15   
 16   /**
 17    * 創建子進程並調用函數execl
 18    * execl 中希望接收以逗號分隔的參數列表,並以NULL指針為結束標志
 19    */
 20   if( fork() == 0 )
 21   {
 22     // in clild 
 23     printf( "1------------execl------------\n" );
 24     if( execl( "/bin/ls", "ls","-a", NULL ) == -1 )
 25     {
 26       perror( "execl error " );
 27       exit(1);
 28     }
 29   }
 30   
 31   /**
 32    *創建子進程並調用函數execv
 33    *execv中希望接收一個以NULL結尾的字符串數組的指針
 34    */
 35   if( fork() == 0 )
 36   {
 37     // in child 
 38     printf("2------------execv------------\n");
 39     if( execv( "/bin/ls",arg) < 0)
 40     {
 41       perror("execv error ");
 42       exit(1);
 43     }
 44   }
 45   
 46   /**
 47    *創建子進程並調用 execlp
 48    *execlp中
 49    *l希望接收以逗號分隔的參數列表,列表以NULL指針作為結束標志
 50    *p是一個以NULL結尾的字符串數組指針,函數可以DOS的PATH變量查找子程序文件
 51    */
 52   if( fork() == 0 )
 53   {
 54     // in clhild 
 55     printf("3------------execlp------------\n");
 56     if( execlp( "ls", "ls", "-a", NULL ) < 0 )
 57     {
 58       perror( "execlp error " );
 59       exit(1);
 60     }
 61   }
 62   
 63   /**
 64    *創建子里程並調用execvp
 65    *v 望接收到一個以NULL結尾的字符串數組的指針
 66    *p 是一個以NULL結尾的字符串數組指針,函數可以DOS的PATH變量查找子程序文件
 67    */
 68   if( fork() == 0 )
 69   {
 70     printf("4------------execvp------------\n");
 71     if( execvp( "ls", arg ) < 0 )
 72     {
 73       perror( "execvp error " );
 74       exit( 1 );
 75     }
 76   }
 77   
 78   /**
 79    *創建子進程並調用execle
 80    *l 希望接收以逗號分隔的參數列表,列表以NULL指針作為結束標志
 81    *e 函數傳遞指定參數envp,允許改變子進程的環境,無后綴e時,子進程使用當前程序的環境
 82    */
 83   if( fork() == 0 )
 84   {
 85     printf("5------------execle------------\n");
 86     if( execle("/bin/ls", "ls", "-a", NULL, NULL) == -1 )
 87     {
 88       perror("execle error ");
 89       exit(1);
 90     }
 91   }
 92   
 93   /**
 94    *創建子進程並調用execve
 95    * v 希望接收到一個以NULL結尾的字符串數組的指針
 96    * e 函數傳遞指定參數envp,允許改變子進程的環境,無后綴e時,子進程使用當前程序的環境
 97    */
 98   if( fork() == 0 )
 99   {
100     printf("6------------execve-----------\n");
101     if( execve( "/bin/ls", arg, NULL ) == 0)
102     {
103       perror("execve error ");
104       exit(1);
105     }
106   }
107   return EXIT_SUCCESS;
108 }

運行結果(linux):

1------------execl------------
.  ..  .deps  exec  exec.o  .libs  Makefile
2------------execv------------
.  ..  .deps  exec  exec.o  .libs  Makefile
3------------execlp------------
.  ..  .deps  exec  exec.o  .libs  Makefile
4------------execvp------------
.  ..  .deps  exec  exec.o  .libs  Makefile
5------------execle------------
.  ..  .deps  .libs  Makefile  exec  exec.o
6------------execve-----------
.  ..  .deps  .libs  Makefile  exec  exec.o
按回車繼續!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM