歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用execvp()函數需要注意的兩點

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

日期:2017/3/1 11:16:05   编辑:Linux編程

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

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