fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。),也就是这两个进程做完全相同的事。

在fork后的子进程中使用exec函数族,可以装入和运行其它程序(子进程替换原有进程,和父进程做不同的事)。

fork创建一个新的进程就产生了一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被 exec 执行的进程的PID不会改变(和调用exec的进程的PID一样)。

exec函数族:

 1 #include <unistd.h>
2 extern char **environ;
3 int execl(const char *path,
4 const char *arg, ...);
5 int execlp(const char *file,
6 const char *arg, ...);
7 int execle(const char *path,
8 const char *arg,
9 ...,
10 char * const envp[]);
11 int execv(const char *path,
12 char *const argv[]);
13 int execvp(const char *file,
14 char *const argv[]);
15 int execve(const char *file,
16 char *const argv[],
17 char *const envp[]);

exec函数族装入并运行程序path/file,并将参数arg0(arg1, arg2, argv[], envp[])传递给子程序,出错返回-1.

在exec函数族中,后缀l、v、p、e指定函数将具有某种操作能力:

后缀 操作能力
l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
v 希望接收到一个以NULL结尾的字符串数组的指针
p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件
e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境

具体例子:

  1 #ifdef HAVE_CONFIG_H
2 #include <config.h>
3 #endif
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <unistd.h>
8 #include <string.h>
9 #include <errno.h>
10
11 int main(int argc, char *argv[])
12 {
13 //以NULL结尾的字符串数组的指针,适合包含v的exec函数参数
14 char *arg[] = {"ls", "-a", NULL};
15
16 /**
17 * 创建子进程并调用函数execl
18 * execl 中希望接收以逗号分隔的参数列表,并以NULL指针为结束标志
19 */
20 if( fork() == 0 )
21 {
22 // in clild
23 printf( "1------------execl------------\n" );
24 if( execl( "/bin/ls", "ls","-a", NULL ) == -1 )
25 {
26 perror( "execl error " );
27 exit(1);
28 }
29 }
30
31 /**
32 *创建子进程并调用函数execv
33 *execv中希望接收一个以NULL结尾的字符串数组的指针
34 */
35 if( fork() == 0 )
36 {
37 // in child
38 printf("2------------execv------------\n");
39 if( execv( "/bin/ls",arg) < 0)
40 {
41 perror("execv error ");
42 exit(1);
43 }
44 }
45
46 /**
47 *创建子进程并调用 execlp
48 *execlp中
49 *l希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
50 *p是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件
51 */
52 if( fork() == 0 )
53 {
54 // in clhild
55 printf("3------------execlp------------\n");
56 if( execlp( "ls", "ls", "-a", NULL ) < 0 )
57 {
58 perror( "execlp error " );
59 exit(1);
60 }
61 }
62
63 /**
64 *创建子里程并调用execvp
65 *v 望接收到一个以NULL结尾的字符串数组的指针
66 *p 是一个以NULL结尾的字符串数组指针,函数可以DOS的PATH变量查找子程序文件
67 */
68 if( fork() == 0 )
69 {
70 printf("4------------execvp------------\n");
71 if( execvp( "ls", arg ) < 0 )
72 {
73 perror( "execvp error " );
74 exit( 1 );
75 }
76 }
77
78 /**
79 *创建子进程并调用execle
80 *l 希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
81 *e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境
82 */
83 if( fork() == 0 )
84 {
85 printf("5------------execle------------\n");
86 if( execle("/bin/ls", "ls", "-a", NULL, NULL) == -1 )
87 {
88 perror("execle error ");
89 exit(1);
90 }
91 }
92
93 /**
94 *创建子进程并调用execve
95 * v 希望接收到一个以NULL结尾的字符串数组的指针
96 * e 函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境
97 */
98 if( fork() == 0 )
99 {
100 printf("6------------execve-----------\n");
101 if( execve( "/bin/ls", arg, NULL ) == 0)
102 {
103 perror("execve error ");
104 exit(1);
105 }
106 }
107 return EXIT_SUCCESS;
108 }

运行结果(linux):

1------------execl------------
. .. .deps exec exec.o .libs Makefile
2------------execv------------
. .. .deps exec exec.o .libs Makefile
3------------execlp------------
. .. .deps exec exec.o .libs Makefile
4------------execvp------------
. .. .deps exec exec.o .libs Makefile
5------------execle------------
. .. .deps .libs Makefile exec exec.o
6------------execve-----------
. .. .deps .libs Makefile exec exec.o
按回车继续!
 
转载链接:http://www.cnblogs.com/blankqdb/archive/2012/08/23/2652386.html
 

exec函数族实例解析-(转自blankqdb)的更多相关文章

  1. exec函数族实例解析

    exec函数族实例解析 fork()函数通过系统调用创建一个与原来进程(父进程)几乎完全相同的进程(子进程是父进程的副本,它将获得父进程数据空间.堆.栈等资源的副本.注意,子进程持有的是上述存储空间的 ...

  2. exec函数族的使用

    作者:王姗姗,华清远见嵌入式学院讲师. exec用被执行的程序完全替换调用它的程序的影像.fork创建一个新的进程就产生了一个新的PID,exec启动一个新程序,替换原有的进程,因此这个新的被exec ...

  3. exec函数族的作用与讲解

    apue看到第八章,对exec函数族的理解一直都很混乱,总觉得不对劲儿,其实不能理解的先暂时跳过,看到后面,再结合实例也就慢慢的理解了. 以下内容转自:http://www.cppblog.com/p ...

  4. Docker网络管理机制实例解析+创建自己Docker网络

    实例解析Docker网络管理机制(bridge network,overlay network),介绍Docker默认的网络方式,并创建自己的网络桥接方式,将开发的容器添加至自己新建的网络,提高Doc ...

  5. exec函数族,守护进程,线程同步和互斥

    2015.3.2 进程和程序有三点不同:1,存在位置不同,程序:硬盘,磁盘.进程:内存2. 程序是静态的,进程是动态的 执行./a.out -->bash->bash程序调用fork()- ...

  6. 程序清单 8-8 exec函数实例,a.out是程序8-9产生的可执行程序

    /* ============================================================================ Name : test.c Author ...

  7. [Reprint] C++函数模板与类模板实例解析

    这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下   本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...

  8. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  9. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

随机推荐

  1. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作win2008r2-19

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作win2008r2-19 欢迎加QQ群:1026880196 进行交流学习 制作OpenSta ...

  2. irreader网页订阅

    flag:立刻阅读,订阅你的全世界 订阅网页.RSS和Podcast,具备急速的阅读体验,高品质.免费.无广告.多平台的阅读器.泛用型Podcast播放器. 下载位置:http://irreader. ...

  3. Boxes in a Line UVA - 12657

      You have n boxes in a line on the table numbered 1...n from left to right. Your task is to simulat ...

  4. JDBC_15_悲观锁和乐观锁

    悲观锁和乐观锁 并发控制 当程序中可能出现并发操作的情况时,就需要保证在并发操作的情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和某个用户单独操作时的结果是一样的.这种手段就叫 ...

  5. composer 使用提示

    1.使用国内镜像[推荐] composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 或者 comp ...

  6. 【ElasticSearch】ElasticSearch集群扫盲

    Cluster 集群 ⼀个 Elasticsearch 集群由⼀个或多个节点(Node)组成,每个集群都有⼀个共同的集群名称作为标识.   Node节点 ⼀个 Elasticsearch 实例即⼀个 ...

  7. LA4851餐厅(求好的坐标的个数)

    题意:       有一个m*m的格子,左下角(0,0)右上角(m-1,m-1),网格里面有两个y坐标相同的宾馆(A,B),每个宾馆里面有一个餐厅,一共用n个餐厅,第1,2个都在宾馆里,3,4...在 ...

  8. hdu1914 稳定婚姻问题

               稳定婚姻问题就是给你n个男的,n个女的,然后给你每个男生中女生的排名,和女生心目中男生的排名,然后让你匹配成n对,使婚姻稳定,假如a和b匹配,c和d匹配,如果a认为d比b好,同时 ...

  9. 使用BurpSuite抓取HTTPS网站的数据包

    昨天面试,技术官问到了我如何使用BurpSuite抓取https网站的数据包,一时间没能回答上来(尴尬!).因为以前https网站的数据包我都是用Fiddler抓取的,Fiddlert自动帮我们配置好 ...

  10. 【CSS】CSS3从入门到深入(复习查漏向

    CSS3从入门到深入(复习查漏向 pre_section CSS:层叠样式表,决定网页表现 网页为多层结构,CSS为每一层设置样式,最后显示最上一层 CSS语句 = 选择器 + 声明块 形式 内联样式 ...