歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

使用execvp()函數需要注意的兩點

exec系統調用會從當前進程中把當前程序的機器指令清除,然後在空的進程中載入調用時指定的程序代碼,最後運行這個新的程序。

  1. #include<stdio.h>   
  2. #include<signal.h>   
  3. #include<string.h>   
  4. #include<unistd.h>   
  5.   
  6. #define     MAXARGS     (20)   
  7. #define     ARGLEN      (100)   
  8.   
  9. int main()  
  10. {  
  11.     char *arglist[MAXARGS + 1];  
  12.     int numargs;  
  13.     char argbuf[ARGLEN];   
  14.     char *makestring();  
  15.   
  16.     numargs = 0;  
  17.   
  18.     while(numargs < MAXARGS)  
  19.     {  
  20.         printf("Arg[%d]?", numargs);  
  21.         if(fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n')  
  22.             arglist[numargs ++] = makestring(argbuf);  
  23.         else  
  24.         {  
  25.             if(numargs > 0)   
  26.             {  
  27.                 arglist[numargs] = NULL;  
  28.                 execute(arglist);  
  29.                 numargs = 0;  
  30.             }  
  31.         }  
  32.     }  
  33.   
  34.     return 0;  
  35. }  
  36.   
  37. int execute(char* arglist[])  
  38. {  
  39. /* 
  40. *#include<unistd.h>  
  41. *int execlp(const char* file, const char* argv ...) 
  42. * eg. execlp("ps","ps","-au","-x",(char*)0); 
  43. *    1.最後一個參數必須是(char*)0, 如果不強制轉換成char*,就會自動轉換成int* 有未知的錯誤。 
  44. *    2.第一個參數是要運行的文件,會在環境變量PATH中查找file. 
  45. *    3.失敗會返回-1, 成功無返回值,但是,會在當前進程運行,執行成功後,直接結束當前進程。可以在子進程中運行。 
  46. *    4.第二個參數,是一個參數列表,如同在shell中調用程序一樣,參數列表為0,1,2,3……因此,ps作為第0個參數,需要重復一遍 
  47. *    int execvp(const char* file, const char* argv[]);  argv列表最後一個必須是 NULL 
  48. */  
  49.     execvp(arglist[0], arglist);  
  50.     perror("execvp failed");  
  51.     exit(1);  
  52. }  
  53.   
  54. char* makestring(char *buf)  
  55. {  
  56.     char *cp, *malloc();  
  57.   
  58.     buf[strlen(buf) - 1] = '\0';  
  59.     cp = malloc(strlen(buf) + 1);  
  60.   
  61.     if(cp == NULL)  
  62.     {  
  63.         fprintf(stderr, "no memory\n");  
  64.         exit(1);  
  65.     }  
  66.     strcpy(cp, buf);  
  67.     return cp;  
  68. }  
Copyright © Linux教程網 All Rights Reserved