系统调用exe函数族对当前进程进行替换,替换着为一个指定程序,其参数包括文件名filename,参数列表argv,以及环境变量envp

整个函数家族如下:

#include <unistd.h>

extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

在名字中缺“e”的是从当前进程中拷贝环境,有字母“p”的是可以在当前路径中查找文件,而其他函数必须在指定路径中找,这里要注意执行路径,有安全隐患,慎用。

练习1:用系统命令替换

[cpp] view plaincopy
  1. /* exec.c */
  2. #include <unistd.h>
  3. main()
  4. {
  5. /*定义参数*/
  6. char *envp[]={"PATH=/tmp",  "USER=lei", "STATUS=testing",NULL};
  7. char *argv_execv[]={"echo", "excuted by execv", NULL};
  8. char *argv_execvp[]={"echo", "executed by execvp", NULL};
  9. char *argv_execve[]={"env", NULL};
  10. /*全部在子进程运行*/
  11. if(fork()==0)
  12. if(execl("/bin/echo", "echo", "executed by execl", NULL)<0)  //调用echo命令,参数:executed by execl
  13. perror("Err on execl");
  14. if(fork()==0)
  15. if(execlp("echo", "echo", "executed by execlp", NULL)<0)
  16. //调用echo命令,参数:executed by execlp
  17. perror("Err on execlp");
  18. if(fork()==0)
  19. if(execle("/usr/bin/env", "env", NULL, envp)<0)  //env命令,打印当前环境envp
  20. perror("Err on execle");
  21. if(fork()==0)
  22. if(execv("/bin/echo", argv_execv)<0)  //echo命令,参数argv_execv指向的内容
  23. perror("Err on execv");
  24. if(fork()==0)
  25. if(execvp("echo", argv_execvp)<0)    //echo命令,参数argv_execvp指向的内容
  26. perror("Err on execvp");
  27. if(fork()==0)
  28. if(execve("/usr/bin/env", argv_execve, envp)<0)
  29. //env命令
  30. perror("Err on execve");
  31. }

程序里调用了2个Linux常用的系统命令,echo和env。echo会把后面跟的命令行参数原封不动的打印出来,env用来列出所有环境变量。

编译,测试:

$ ./exec
executed by execl

executed by execlp
PATH=/tmp
USER=lei
STATUS=testing
executed by execlp
excuted by execv
executed by execvp
PATH=/tmp
USER=lei
STATUS=testing

练习2:子进程执行用户自己编写的程序

先写父进程的程序:

[cpp] view plaincopy
  1. /*parent.c*/
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. int main(void)
  6. {
  7. pid_t pid;
  8. const char *usr_envp[] = {"MYDEFINE=unknown","PATH=/home",NULL};//路径
  9. printf("Begin Fork()/n");
  10. pid = fork();
  11. switch(pid)
  12. {
  13. case -1:
  14. perror("fork failed!/n");
  15. break;
  16. case 0:
  17. /*准备执行子进程的程序*/
  18. if(execle("/home/child","myarg1","myarg2",(char *)0,usr_envp)) //路径/home/child,参数...
  19. perror("execle failed!/n");
  20. break;
  21. default:
  22. break;
  23. }
  24. //等待子进程退出
  25. if(waitpid(pid,NULL,0)<0)
  26. perror("waitpid failed!/n");
  27. printf("parent excting!");
  28. return 0;
  29. }

然后我们编写子进程要执行的程序:

[cpp] view plaincopy
  1. /*child.c*/
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. int main(int argc,char *argv[])
  6. {
  7. int i;
  8. char **pStr;
  9. extern char **environ;
  10. printf("child starting!/n");
  11. //打印出参数名
  12. for(i = 0;i < argc;i++)
  13. {
  14. printf("argv[%d]:%s/n",i,argv[i]);
  15. }
  16. //打印出路径名
  17. for(pStr = environ; *pStr != 0;pStr++)
  18. {
  19. printf("%s/n",i,*pStr);
  20. }
  21. printf("child exiting!/n");
  22. return 0;
  23. }

然后编译,执行parent

$ ./parent

Begin Fork()

child starting!

argv[0]:myargv1

argv[1]:myargv2

child exiting!

parent excting!

进程控制2--exec族相关推荐

  1. 【转载】linux进程控制-exec系列 exec系统调用

    inux进程控制-exec系列 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h ...

  2. 【Linux】进程控制(exec函数族)的理解和使用

    文章目录 1. 进程程序替换是什么 2. 进程替换函数--exec族 3. execl函数的使用 4. execv函数的使用 5. execlp函数的使用 6. execvp函数的使用 7. 验证ex ...

  3. Linux进程编程(PS: exec族函数、system、popen函数)

    目录 1.进程相关概念 程序和进程 查看系统中的进程 ps指令 top指令 进程标识符 使用getpid()获取 父进程,子进程 2.创建进程fork 进程创建发生了什么--C程序的存储空间如何分配 ...

  4. Linux 进程11【exec族函数(execl, execlp, execle, execv, execvp, execvpe)】

    linux进程-exec族函数(execl, execlp, execle, execv, execvp, execvpe) 原文链接:https://blog.csdn.net/u014530704 ...

  5. Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用

    exec族函数(execl, execlp, execle, execv, execvp, execvpe)及exec配合fork使用 exec族函数函数的作用: 我们用fork函数创建新进程后,经常 ...

  6. Linux进程—exec族函数 execl, execlp, execle, execv, execvp

    exec族函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec族函数去执行新的程序:当该进程调用exec族函数时,该进程被替代为新程序,因为exec族函数并不创建新进程,所以前后 ...

  7. Linux 进程控制(创建/退出/等待/替换)

    目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...

  8. Linux进程全解8——exec 族函数

    以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 1.为什么需要exec函数? (1)fork子进程是为了执行新程序 fork创建子进程后,子进程和父进程同时被OS ...

  9. Linux下的进程控制原语【pid_t,fork,exec,wait,waitpid,getpid,kill,pasue,sleep,signal】

    目录 一.pid_t 进程号类型 二.与进程创建.执行有关的系统调用说明 fork()系统调用: exec 系统调用: wait() 和 waitpid() 系统调用: getpid()系统调用语法: ...

  10. exec函数介绍(整理)(附带:操作系统实验一:进程控制实验 代码)

    (1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...

最新文章

  1. 技术不是大数据第一生产力,数据交易才能带来应用爆发
  2. 使用 NLTK 对文本进行清洗,索引工具
  3. C语言引用文件空格和换行,关于文件操作,碰到空格就换行
  4. 使用条件注释完成浏览器兼容
  5. python3的float数精度_python浮点数精度问题
  6. 【RAC】How to Proceed from Failed 11gR2 CRS Installation
  7. 丢机者要哭:苹果移除了 iCloud 激活锁状态查询页面
  8. 实现语音视频录制源码分享
  9. java文件 默认打开方式_修改文件的默认打开方式(亲测有效)
  10. 用 Hypothesis 来自动化单元测试
  11. 硬件安全之ARM体系架构的演进
  12. ecplise配置tomcat
  13. NSNumber 与 Tagged Pointer
  14. 详解企业内部即时通讯工具特点
  15. 数组指针——指向数组对象的指针
  16. PhotoShop常用的快捷键及 瘦身
  17. 华为手表开发:WATCH 3 Pro(3)创建项目以及运行完整流程
  18. 批量nii文件转换成jpg格式
  19. Python连接数据库 教程
  20. 视频教程-尹成老师带你学算法-Java

热门文章

  1. Android中设置输入法为数字输入
  2. java 注入 循环_spring依赖注入——循环依赖
  3. (JAVA)String类之比较方法(2)
  4. HBase 2.0版本正式发布
  5. spring----Bean的生命周期和循环依赖
  6. MySql Delimiter
  7. steelray project viewer
  8. Mysql编辑工具中使用(Navicat查询结果显示行号)
  9. thinkphp小技巧
  10. 【小技巧】【Java】 创建指定数目m的Set数组