Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1058802
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 16:16:08


点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/types.h>
  6. #include <unistd.h>

  7. char * arg_init[]={"canshu", "aaa", "bbb", "ccc", NULL};
  8. char * arg_init2[]={"ls", "-l", "-r", "-t", NULL};
  9. char * arg_init3[]={"ls", NULL};
  10. char * env_init[]={"WANGXC=wangxiancai", "ZHANGQP=zhangqiuping", NULL};
  11. char * env_init2[]={"WANGXC2=wangxiancai", "ZHANGQP2=zhangqiuping", NULL};

  12. extern char * * environ;

  13. int main(int argc, char * * argv, char * * envp)
  14. {
  15.     int pid = -1;
  16.     int ret = -1;
  17.     printf("exec函数演示:\n");
  18.     /*1, execlp函数:
  19.     第1个参数不包含/是文件名:默认在PATH目录(一般是包括当前目录)中寻找可执行文件.
  20.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  21.     第2个参数开始到NULL参数:都是参数表,所以第2个参数是argv[0],即可执行程序名。
  22.     第3个参数是argv[0]程序的第1个参数,即是argv[1]
  23.     参数表最后一个参数一定是NULL。*/
  24.     pid = fork();
  25.     if(pid == 0)
  26.     {
  27.         ret = execlp("canshu", "canshu", "aaa", "bbb", "ccc", (char*)0);
  28.         if(ret < 0)
  29.         {
  30.                 printf("execlp err, ret=[%d]!\n", ret);
  31.                 exit(0);
  32.         }
  33.     }
  34.     //ret = execlp("canshu", "canshu", NULL);
  35.     //ret = execlp("canshu", "canshu", "aaa", "bbb", "ccc", (char*)0);
  36.     //ret = execlp("canshu", "canshu", "aaa", "bbb", "ccc", NULL);
  37.     //ret = execlp("./canshu", "canshu", "aaa", "bbb", "ccc", (char*)0);
  38.     //ret = execlp("/home/eas/src/API_fun/canshu", "canshu", "aaa", "bbb", "ccc", (char*)0);
  39.     //ret = execlp("/home/eas/src/API_fun/canshu", "canshu", "aaa", "bbb", "ccc", (char*)0);
  40.     //ret = execlp("ls", "ls", NULL);
  41.     //ret = execlp("ls", "ls", "-l", NULL);
  42.     //ret = execlp("ls", "ls", "-l", "-r", "-t", NULL);
  43.     //if(ret < 0)
  44.     //{
  45.         //printf("execlp err, ret=[%d]\n", ret);
  46.     //}
  47.     
  48.     /*2, execvp函数:
  49.     第1个参数不包含/是文件名:默认在PATH目录(一般是包括当前目录)中寻找可执行文件,
  50.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  51.     第2个参数:参数表首地址。*/
  52.     //ret = execvp("./canshu", arg_init);
  53.     //ret = execvp("canshu", arg_init);
  54.     //ret = execvp("canshu", NULL);
  55.     //ret = execvp("/home/eas/src/API_fun/canshu", arg_init);
  56.     //ret = execvp("ls", NULL);
  57.     //ret = execvp("ls", arg_init2);
  58.     //if(ret < 0)
  59.     //{
  60.         //printf("execvp err, ret=[%d]\n", ret);
  61.     //}
  62.     
  63.     /*3, execve函数:唯一系统调用的函数.
  64.     第1个参数不包含/是文件名:默认只在当前目录中寻找可执行文件。
  65.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  66.     如果不写全路径,则只在当前目录下寻找可执行文件。
  67.     第2个参数:参数表首地址。
  68.     第3个参数:环境表首地址*/
  69.     //ret = execve("./canshu", arg_init, env_init);
  70.     //ret = execve("canshu", arg_init, env_init);
  71.     //ret = execve("canshu", NULL, NULL);
  72.     ret = execve("/home/eas/src/API_fun/canshu", arg_init, env_init);
  73.     //ret = execve("/home/eas/src/API_fun/canshu", arg_init, envp);
  74.     //ret = execve("/home/eas/src/API_fun/canshu", argv, env_init);
  75.     //ret = execve("/home/eas/src/API_fun/canshu", argv, envp);
  76.     //ret = execve("/home/eas/src/API_fun/canshu", argv, envp);
  77.     //ret = execve("/bin/ls", arg_init2, envp); /*ls命令必须写全路径,如果不写全路径,则只在当前目录下寻找可执行程序ls*/
  78.     //ret = execve("/bin/ls", NULL, env_init);
  79.     //ret = execve("/bin/ls", NULL, NULL);
  80.     //if(ret < 0)
  81.     //{
  82.     //    printf("execve err, ret=[%d]\n", ret);
  83.     //}
  84.     
  85.     /*4, execle函数
  86.     第1个参数不包含/是文件名:默认只在当前目录中寻找可执行文件,
  87.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  88.     如果不写全路径,则只在当前目录下寻找可执行文件。
  89.     第2个参数:参数表首地址。
  90.     第3个参数:环境表首地址*/
  91.     //ret = execle("canshu", "canshu", "aaa", "bbb", "ccc", NULL, envp);
  92.     //ret = execle("canshu", "canshu", "aaa", "bbb", "ccc", NULL, environ);
  93.     //ret = execle("canshu", "canshu", "aaa", "bbb", "ccc", NULL, env_init);
  94.     //ret = execle("canshu", "canshu", "aaa", "bbb", "ccc", NULL, NULL);
  95.     //ret = execle("canshu", NULL, NULL);
  96.     //ret = execle("/home/eas/src/API_fun/canshu", "canshu", "aaa", "bbb", "ccc", NULL, env_init);
  97.     //ret = execle("/home/eas/src/API_fun/canshu", "canshu", "aaa", "bbb", "ccc", NULL, envp);
  98.     //ret = execle("/bin/ls", "ls", NULL, envp); /*ls命令必须写全路径*/
  99.     //ret = execle("/bin/ls", NULL, envp);
  100.     //ret = execle("/bin/ls", NULL, NULL);
  101.     //if(ret < 0)
  102.     //{
  103.         //printf("execle err, ret=[%d]\n", ret);
  104.     //}
  105.     
  106.     /*5, execv函数:
  107.     第1个参数不包含/是文件名:默认只在当前目录中寻找可执行文件,
  108.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  109.     如果不写全路径,则只在当前目录下寻找可执行文件。
  110.     第2个参数:参数表首地址。*/
  111.     //ret = execv("canshu", NULL);
  112.     //ret = execv("canshu", arg_init);
  113.     //ret = execv("./canshu", arg_init);
  114.     //ret = execv("/home/eas/src/API_fun/canshu", NULL);
  115.     //ret = execv("/home/eas/src/API_fun/canshu", arg_init);
  116.     //ret = execv("/bin/ls", NULL); /*ls必须写全路径*/
  117.     //ret = execv("/bin/ls", arg_init2);
  118.     //if(ret < 0)
  119.     //{
  120.         //printf("execv err, ret=[%d]\n", ret);
  121.     //}
  122.     
  123.     /*6, execl函数:
  124.     第1个参数不包含/是文件名:默认只在当前目录中寻找可执行文件,
  125.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  126.     如果不写全路径,则只在当前目录下寻找可执行文件。
  127.     第2个参数:参数表首地址。*/
  128.     //ret = execl("canshu", NULL);
  129.     //ret = execl("canshu", "canshu", "aaa", "bbb", "ccc", NULL);
  130.     //ret = execl("./canshu", NULL);
  131.     //ret = execl("./canshu", "canshu", NULL);
  132.     //ret = execl("/home/eas/src/API_fun/canshu", NULL);
  133.     //ret = execl("/home/eas/src/API_fun/canshu", "canshu", "aaa", "bbb", "ccc", NULL);
  134.     //ret = execl("/bin/ls", NULL); /*ls必须写全路径*/
  135.     //ret = execl("/bin/ls", "ls", "-l", "-r", "-t", NULL);
  136.     //ret = execl("echo.sh", "echo.sh", NULL);
  137.     if(ret < 0)
  138.     {
  139.         printf("execl err, ret=[%d]\n", ret);
  140.     }
  141.     else /*这一句永远不会执行*/
  142.     {
  143.         printf("execl OK!\n");
  144.     }
  145.     
  146.     return 0;
  147. }
实例,execl执行一个解释器文件

点击(此处)折叠或打开

  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <sys/types.h>
  6. #include <unistd.h>

  7. int main(int argc, char * * argv, char * * envp)
  8. {
  9.     int pid = -1;
  10.     int ret = -1;
  11.     printf("执行一个解释器文件演示:\n");
  12.     
  13.     /*6, execl函数:
  14.     第1个参数不包含/是文件名:默认只在当前目录中寻找可执行文件,
  15.     第1个参数包含/是路径名:在指定目录中寻找可执行文件。
  16.     如果不写全路径,则只在当前目录下寻找可执行文件。
  17.     第2个参数:参数表首地址。*/

  18.     //ret = execl("/home/eas/src/API_fun/canshu", NULL);
  19.     ret = execl("/home/eas/src/API_fun/jieshi", "jieshi", "111", "222", "333", NULL);
  20.     if(ret < 0)
  21.     {
  22.         printf("execl err, ret=[%d]\n", ret);
  23.     }
  24.     else /*这一句永远不会执行*/
  25.     {
  26.         printf("execl OK!\n");
  27.     }
  28.     
  29.     return 0;
  30. }

阅读(351) | 评论(0) | 转发(0) |
0

上一篇:main函数的环境参数

下一篇:status用法

给主人留下些什么吧!~~