用fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec 函数以执行另一个程序。当进程调用一种exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec 并不创建新进程,所以调用exec 前后该进程的id并未改变。
exec函数可分了两大系列,主要的区别在于命令行参数的传递.
execl(const char* path,const char* arg,...);
execlp(const char* file,const char* arg,...);
execle(const char* path,const char* arg,...,const char* envp);
execv(const char* path,char*const argv[],...);
execvp(const char* file,char*const argv[],...);
execve(const char* path,char*const argv[],...,const char* envp);
第一个参数
无p的函数第一个参数要求的是程序的绝对路径或者相对路径如/bin/sh ,./sh
有p的函数第一个参数:
1:如果参数中包含/,则将其视为路径名。
2:否则视为不带路径的程序名,在PATH 环境变量的目录列表中搜索这个程序。
第二个可变参数
对于带l的函数可变参数是从左至右参数列表传递,而带v的就如我们的int main(int argc,int* argv[]),的第个参数般,是按指针数组传递的.
参数envp是代表环境变量.可以把一份新的环境变量表传给它,其
他exec 函数仍使用当前的环境变量表执行新程序。
事实上,只有execve是真正的系统调用,其它五个函数最终都调用execve
一个完整的例子:
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
execlp("ps", "ps", "-o", "pid,ppid,pgrp,session,tpgid,comm", NULL);
perror("exec ps");
exit(1);
}
执行此程序则得到:
$ ./a.out
PID PPID PGRP SESS TPGID COMMAND
6614 6608 6614 6614 7199 bash
7199 6614 7199 6614 7199 ps
由于exec
函数只有错误返回值,只要返回了一定是出错了,所以不需要判断它的返回值,直接在后面调用perror
即可。注意在调用execlp
时传了两个"ps"
参数,第一个"ps"
是程序名,execlp
函数要在PATH
环境变量中找到这个程序并执行它,而第二个"ps"
是第一个命令行参数,execlp
函数并不关心它的值,只是简单地把它传给ps
程序,ps
程序可以通过main
函数的argv[0]
取到这个参数。
分享到:
相关推荐
该程序是我写的博客“一起talk C栗子吧(第一百三十六回:C语言实例--exec系列函数二)”的配套程序,共享给大家使用
1、fork 函数介绍 2、典型使用 fork 的代码片段: 3、示例 1、exec 系列函数介绍 2、头文件: 3、示例
Linux进程控制编程-exec系列函数应用.pdf 学习资料 复习资料 教学资源
系统调用fork( ), exec系列函数,exit( ), wait( )的功能和实现过程 使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示...
关于fork函数的介绍,和测试程序,原版fork linux平台
exec*()系列函数,用于在程序中执 行外部文件(main(int argc, char* argv[]算不算呢,与其说main()也是一个 可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函 数,至少在原理这一级上有很多...
exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[])算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函数,至少在原理这一级上有很多相似之...
本文结合Understanding Linux Kernel英文版第三版以及Linux2.6.11源代码详细分析了Linux exec函数族调用时内核对于进程切换所完成的一系列关于进程运行环境的初始化的过程。
linux中有六种调用形式及以exec开头调用函数
(4)服务器端在接收客户端的配置信息后,使用exec 系列函数完成对IP 地址、掩码、默认网关、DNS修改,并写入相应的配置文件。结果验证:使用ifconfig检查IP地址信息配置的正确性;使用nslookup检查DNS信息的正确性。 ...
函数式编程是指用一系列函数决定问题 函数是一等公民 函数本身可以赋值给变量,赋值后变量绑定函数 允许将函数本身作为参数传入另一个函数 允许返回一个函数 函数的可重入性: 可重入是指一个函数传的参数...
在 Golang 中用于执行命令的库是 os/exec,exec.Command 函数返回一个 Cmd 对象,根据不同的需求,可以将命令的执行分为三种情况 只执行命令,不获取结果 执行命令,并获取结果(不区分 stdout 和 stderr) 执行...
用C/C++实现Linux文件操作命令ls,能够显示文件内容,显示文件内容,实现-l、-h、–r、-t、-R等选项的功能。 说明:不能使用system函数或exec系列函数。
curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select 一般来说,想到要用这些函数时,目的显然应该是要同时请求多个url,而不是一个一...
├─libmad高精度音频解码库源码 ├─Mplayer源码 ├─Tiny4412开发板声卡驱动 └─示例代码 ├─01 mplayer从模式使用示例 ... ├─06 exec系列函数使用示例 └─07 mplayer自动播放示例_模板代码
创建子进程一,在子进程中递归打印/home目录中的内容(用exec系列函数调用第二次实验中的代码完成此功能); 1.子进程结束的时候完成以下功能: 打印字符串“Child process exited!” 打印子进程标识符...
掌握系统调用fork( ),exec系列函数(6个),exit( ),wait( ),waitpid( ),getpid( ),getppid( )的功能和实现过程。 3. 编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父...
4.2.4 进程执行exec()函数系列 99 4.2.5 所有用户态进程的产生进程init 100 4.3 进程间通信和同步 101 4.3.1 半双工管道 101 4.3.2 命名管道 107 4.3.3 消息队列 108 4.3.4 消息队列的一个例子 114 ...
正则表达式-评估函数 正则表达式,正则表达式或正则表达式(有时称为有理表达式)是定义搜索模式的一系列字符。 通常,字符串搜索算法会将此类模式用于字符串的“查找”或“查找并替换”操作,或用于输入验证。 ...
4.2.4 进程执行exec()函数系列 99 4.2.5 所有用户态进程的产生进程init 100 4.3 进程间通信和同步 101 4.3.1 半双工管道 101 4.3.2 命名管道 107 4.3.3 消息队列 108 4.3.4 消息队列的一个例子 114 ...