exec函数族

函数族说明

fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。

在 Linux 中使用exec函数族主要有两种情况:

●  当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用 exec 函数族中的任意一个函数让自己重生。

●  如果一个进程想执行另一个程序,那么它就可以调用 fork() 函数新建一个进程,然后调用 exec 函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。

函数族语法

实际上,在Linux中并没有exec()函数,而是由6个以 exec 开头的函数,它们之间的语法有细微差别。下表列出了 exec 函数族的6个成员函数的语法:

这6个函数在函数名和使用语法的规则上都有细微的区别,下面就从可执行文件查找方式、参数传递方式和环境变量这几个方面进行比较。

●  查找方式:表1中的前4个函数的查找方式都是完整的文件目录路径,而最后两个函数(也就是以 p 结尾的两个函数)可以只给出文件名,系统就会自动按照环境变量“$PATH” 所指定的路径进行查找。

●   参数传递方式:exec函数族的参数传递有两种:一种是逐个列举的方式,而另一种则是将所有参数整体构造指针数组传递。在这里是以函数名的第5位字母来区分的,字母为 "l"(list)的表示逐个列举参数的方式,其语法为const char *arg;字母为“v”(vector)的表示将所有参数整体构造指针数组传递,其语法为 char *const argv[]。这里的参数实际上就是用户在使用这个可执行文件时所需的全部命令选项字符串(包括该可执行程序命令本身)。要注意的是,这些参数必须以NULL结束。

●   环境变量: exec函数族可以默认系统的环境变量,也可以传入指定的环境变量。这里以 “e”(environment)结尾的两个函数 execle()和 execve()就可以在 envp[]中指定当前进程所使用的环境变量。

表2再对这6个函数中的函数名和对应语法做了一个小结,主要指出了函数名中每一位对应所表明的含义,以此表加以记住这6个函数。

事实上,这6个函数中真正的系统调用只有execve(),其他5个都是库函数,它们最终都会调用execve()这个系统调用。在使用exec函数族时,一定要加上错误判断语句。exec 很容易执行失败,其中最常见的原因有:

①  找不到文件或路径,此时 errno 被设置为 ENOENT。

②  数组argv 和envp  忘记用NULL结束,此时,errno被设置为 EFAUL。

③  没有对应可执行文件的运行权限,此时 errno 被设置为EACCES。

基础实验

实验1

本实验是为了说明如何使用文件名来查找可执行文件,同时使用参数列表的方式。这里用的函数是 execlp()。程序代码如下:

在该程序中,首先使用 fork()函数创建一个子进程,然后在子进程中使用 execlp()函数。可以看到,这里的参数列表列出了在 shell 中使用的命令名和选项,并且当使用文件名进行查找时,系统会在默认的环境变量PATH中寻找该可执行文件。

使用命令:gcc execlp.c -o execlp编译后,然后再执行,结果如下图:

使用env命令,可以查看到环境变量的路径名

此程序的执行结果与在shell中直接输入命令“ps -ef”是一样的,当然,在不同系统的不同时刻可能会有不同的结果。

实验2

本实验实现的功能和实验1的一样,不同的是使用的函数不同。本实验将使用完整的文件目录来查找对应的可执行文件。注意,目录必须以“/”开头,否则将其视为文件名。程序代码如下:

编写保存源文件,然后使用命令:gcc execl.c -o execl编译,接着执行命令:./execl,可以看到实验结果和实验1一样

实验3

本实验是利用execle()函数将环境变量添加到新建的子进程中,这里的“env”是查看当前进程环境变量的命令,实验代码如下:

编写保存源文件后,使用命令:gcc execle.c -o execle,再执行命令:./execle,执行结果如下图

实验4

本实验实现功能和实验3一样,不同的是使用的execve()函数,通过构造指针数组的方式来传递参数,注意参数列表一定要以NULL作为结尾标识符,实验代码如下:

编写保存源文件,使用命令:gcc execve.c -o execve,再执行命令:./execve,结果如下:

到此关于进程的执行实验完毕,下一节学习进程的终止

Linux多任务编程(三)---exec函数族及其基础实验相关推荐

  1. Linux多任务编程之七:Linux守护进程及其基础实验(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  2. Linux多任务编程之五:exit()和_exit()函数(转)

    来源:CSDN  作者:王文松   转自:Linux公社 ----------------------------------------------------------------------- ...

  3. Linux网络编程之套接字基础

    Linux网络编程之套接字基础 1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_ ...

  4. Linux 串口编程三 使用termios与API进行串口程序开发

    在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解.事实上,快速掌握一项技术的核心点也是一种学习能力.对于使 ...

  5. Linux多任务编程(二)---fork()函数及其基础实验

    fork()函数   在 Linux 中创建一个新进程的唯一方法是使用fork()函数.fork()函数是 Linux 系统中一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次 ...

  6. Linux多任务编程——进程

    进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...

  7. Linux学习日记15——exec函数族、回收子进程

    学习视频链接 黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=95&spm_id_from ...

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

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

  9. linux网络编程(一)网络基础传输知识

    linux网络编程(一)网络传输基础知识 一.什么是协议? 二.使用步骤 典型协议 2.网络应用程序设计模式 C/S模式 B/S模式 优缺点 3.分层模型 4.TCP/IP四层模型 通信过程 5.协议 ...

最新文章

  1. php的扩展memcache和memcached区别分析
  2. Almost sorted interval
  3. halcon例程讲解_跟我学机器视觉-HALCON学习例程中文详解-开关引脚测量
  4. 厦门大学2016年高等代数考研试题参考解答
  5. 【斐波那契】【前缀和】无限序列
  6. 前端学习(2349):tabber的其他属性
  7. 绝对定位relative、相对定位absolute(脱离文档流)
  8. 一台服务器创建多个ssh_如何创建可用于生产的第一台安全服务器
  9. 通过 ASP.NET 2.0 的数据增强功能来提高负载和减少代码 --作者:Dino Esposito
  10. Tensorflow-gpu 2.4.1与CUDA11.1,cuDNN8.1配置问题
  11. nekohtml和htmlparser
  12. python如何截长图_Python网页截图/屏幕截图/截长图如何实现?
  13. 基于java+springboot+mysql的校园二手交易平台
  14. Badboy下载地址
  15. TLQ的安装路径不存在或不正确
  16. Android实现淘宝体验的商品列表排序分类点击事件
  17. 我的十年 谨以此文迎接我即将到来的三十而立
  18. 支持一对多脱机克隆,ORICO发布三款便携式硬盘对拷机 - 超能网
  19. 教师需要为学生的学习把握节奏
  20. JavaScript-高级进阶

热门文章

  1. 用c语言递归函数实现焚天塔的过程,梵天塔问题.PPT
  2. Sun Oracle服务器做磁盘raid
  3. 突变检测软件 测试数据库,测序数据比对和变异检测
  4. ConcurrentProgramming:wait()和notify()和synchronized
  5. 问题:org.apache.dubbo.remoting.TimeoutException
  6. cmd窗口pip显示不是内部或外部命令,也不是可运行的程序或批处理文件
  7. webservice之helloword(web)rs
  8. SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容
  9. 转载:WPF binding
  10. 条款05:了解C++默默编写并调用哪些函数