进程控制2--exec族
系统调用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:用系统命令替换
- /* exec.c */
- #include <unistd.h>
- main()
- {
- /*定义参数*/
- char *envp[]={"PATH=/tmp", "USER=lei", "STATUS=testing",NULL};
- char *argv_execv[]={"echo", "excuted by execv", NULL};
- char *argv_execvp[]={"echo", "executed by execvp", NULL};
- char *argv_execve[]={"env", NULL};
- /*全部在子进程运行*/
- if(fork()==0)
- if(execl("/bin/echo", "echo", "executed by execl", NULL)<0) //调用echo命令,参数:executed by execl
- perror("Err on execl");
- if(fork()==0)
- if(execlp("echo", "echo", "executed by execlp", NULL)<0)
- //调用echo命令,参数:executed by execlp
- perror("Err on execlp");
- if(fork()==0)
- if(execle("/usr/bin/env", "env", NULL, envp)<0) //env命令,打印当前环境envp
- perror("Err on execle");
- if(fork()==0)
- if(execv("/bin/echo", argv_execv)<0) //echo命令,参数argv_execv指向的内容
- perror("Err on execv");
- if(fork()==0)
- if(execvp("echo", argv_execvp)<0) //echo命令,参数argv_execvp指向的内容
- perror("Err on execvp");
- if(fork()==0)
- if(execve("/usr/bin/env", argv_execve, envp)<0)
- //env命令
- perror("Err on execve");
- }
程序里调用了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:子进程执行用户自己编写的程序
先写父进程的程序:
- /*parent.c*/
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- int main(void)
- {
- pid_t pid;
- const char *usr_envp[] = {"MYDEFINE=unknown","PATH=/home",NULL};//路径
- printf("Begin Fork()/n");
- pid = fork();
- switch(pid)
- {
- case -1:
- perror("fork failed!/n");
- break;
- case 0:
- /*准备执行子进程的程序*/
- if(execle("/home/child","myarg1","myarg2",(char *)0,usr_envp)) //路径/home/child,参数...
- perror("execle failed!/n");
- break;
- default:
- break;
- }
- //等待子进程退出
- if(waitpid(pid,NULL,0)<0)
- perror("waitpid failed!/n");
- printf("parent excting!");
- return 0;
- }
然后我们编写子进程要执行的程序:
- /*child.c*/
- #include <sys/types.h>
- #include <unistd.h>
- #include <stdio.h>
- int main(int argc,char *argv[])
- {
- int i;
- char **pStr;
- extern char **environ;
- printf("child starting!/n");
- //打印出参数名
- for(i = 0;i < argc;i++)
- {
- printf("argv[%d]:%s/n",i,argv[i]);
- }
- //打印出路径名
- for(pStr = environ; *pStr != 0;pStr++)
- {
- printf("%s/n",i,*pStr);
- }
- printf("child exiting!/n");
- return 0;
- }
然后编译,执行parent
$ ./parent
Begin Fork()
child starting!
argv[0]:myargv1
argv[1]:myargv2
child exiting!
parent excting!
进程控制2--exec族相关推荐
- 【转载】linux进程控制-exec系列 exec系统调用
inux进程控制-exec系列 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h ...
- 【Linux】进程控制(exec函数族)的理解和使用
文章目录 1. 进程程序替换是什么 2. 进程替换函数--exec族 3. execl函数的使用 4. execv函数的使用 5. execlp函数的使用 6. execvp函数的使用 7. 验证ex ...
- Linux进程编程(PS: exec族函数、system、popen函数)
目录 1.进程相关概念 程序和进程 查看系统中的进程 ps指令 top指令 进程标识符 使用getpid()获取 父进程,子进程 2.创建进程fork 进程创建发生了什么--C程序的存储空间如何分配 ...
- Linux 进程11【exec族函数(execl, execlp, execle, execv, execvp, execvpe)】
linux进程-exec族函数(execl, execlp, execle, execv, execvp, execvpe) 原文链接:https://blog.csdn.net/u014530704 ...
- Linux进程5:exec族函数(execl, execlp, execle, execv, execvp, execvpe)总结及exec配合fork使用
exec族函数(execl, execlp, execle, execv, execvp, execvpe)及exec配合fork使用 exec族函数函数的作用: 我们用fork函数创建新进程后,经常 ...
- Linux进程—exec族函数 execl, execlp, execle, execv, execvp
exec族函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec族函数去执行新的程序:当该进程调用exec族函数时,该进程被替代为新程序,因为exec族函数并不创建新进程,所以前后 ...
- Linux 进程控制(创建/退出/等待/替换)
目录 进程创建 fork()函数 fork返回值 fork写时拷贝 fork失败原因 fork用法 进程退出 退出场景 常见的退出方法 正常退出 异常退出 _exit()系统调用 exit()函数 _ ...
- Linux进程全解8——exec 族函数
以下内容源于朱有鹏<物联网大讲堂>的课程学习整理,如有侵权,请告知删除. 1.为什么需要exec函数? (1)fork子进程是为了执行新程序 fork创建子进程后,子进程和父进程同时被OS ...
- Linux下的进程控制原语【pid_t,fork,exec,wait,waitpid,getpid,kill,pasue,sleep,signal】
目录 一.pid_t 进程号类型 二.与进程创建.执行有关的系统调用说明 fork()系统调用: exec 系统调用: wait() 和 waitpid() 系统调用: getpid()系统调用语法: ...
- exec函数介绍(整理)(附带:操作系统实验一:进程控制实验 代码)
(1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...
最新文章
- 技术不是大数据第一生产力,数据交易才能带来应用爆发
- 使用 NLTK 对文本进行清洗,索引工具
- C语言引用文件空格和换行,关于文件操作,碰到空格就换行
- 使用条件注释完成浏览器兼容
- python3的float数精度_python浮点数精度问题
- 【RAC】How to Proceed from Failed 11gR2 CRS Installation
- 丢机者要哭:苹果移除了 iCloud 激活锁状态查询页面
- 实现语音视频录制源码分享
- java文件 默认打开方式_修改文件的默认打开方式(亲测有效)
- 用 Hypothesis 来自动化单元测试
- 硬件安全之ARM体系架构的演进
- ecplise配置tomcat
- NSNumber 与 Tagged Pointer
- 详解企业内部即时通讯工具特点
- 数组指针——指向数组对象的指针
- PhotoShop常用的快捷键及 瘦身
- 华为手表开发:WATCH 3 Pro(3)创建项目以及运行完整流程
- 批量nii文件转换成jpg格式
- Python连接数据库 教程
- 视频教程-尹成老师带你学算法-Java