今天继续学习进程相关的东东,继上节最后简单介绍了用exec函数替换进程映像的用法,今天将来深入学习exec及它关联的函数,话不多说,正式进入正题:

exec替换进程映象:
 

对于fork()函数,它创建了一个新进程,新进程与原进程几乎是一样的,而对于shell命令,如:

对于shell命令,它本身就是一个进程,要想执行ls程序,则需去加载ls程序,这时shell命令进程则需fork()创建一个新进程,而我们知道新创建的进程与原进程几乎是一样的,也就意味着新的进程的代码还是跟shell程序本身是一样的,也就无法执行ls程序,所以,这时我们只有将新进程用ls程序替换,也就是用exec系列函数来替换,这也就是它的意义所在。

下面以实际代码来简单对exec系列的函数有个初步的认识,下面还会一一对其展开学习的:

exec关联函数组:

编译运行:

说明:关于execlp函数的具体使用先不用太关心,下面会有详细介绍的,目前先只是拿它来说明一些问题】

那如果被execlp函数替换后的进程ID是否会发生变化呢?为了说明这个问题,我们先编写一个打印进程ID的程序:

hello.c:

编译,会用execl替换我们编写的程序,来论证我们提出的问题:

再来用execl替换成我们写的hello程序:

这时运行:

如果将程序做一点小改动,如下:

这时编译运行:

这时为什么呢?这是因为execlp函数执行失败了,所以没有替换成功,可以打印一下错误信息:

编译运行:

这时因为:

其中linux的环境变量如下:

下面就具体对execlp系列的每个函数进行研究,先从整体上来看一下这些函数:

下面用代码来演示一下execlp与execvp这两个函数用法的差别:

编译运行:

换成不带l的函数,看下它的使用方式:

其运行结果跟上面一样,这就是带l的函数与不带l函数的使用区别。

下面来说明一下函数参数的意义:

下面,我们来研究一下下面两个函数的区别:

编译运行:

这是因为execl中的程序名需要带上全路径,而execlp不需要定全路径,会自动在环境变量中去搜寻,这就是带p与不带p的区别,于是我们看一下ls命令的路径:

于是,将这个路径替换一下:

再次编译运行:

所以,对于下面这两个函数也就明白啥区别了:

这里就不做实验了,对于exec系列的函数,最后还剩一个execle函数:

下面就以实际代码来解析下这个参数的含义:

hello.c还是之前的代码,再贴出来:

编译运行:

下面我们将hello.c来输出程序的环境变量,实际上有对应的shell命令能够输出,效果如下:

于是改装我们的hello.c:

而对于environ的数据结构是这样的:

这时,编译一下执行hello:

这时,我们再执行之前替换hello的函数,这时也会输出环境信息:

这时我们将execl函数,改为execle,并传递我们自己的环境信息:

编译运行:

至此,我们已经把exec系列相关的函数的区别,就已经全部学完了,可以好好体会下,对于这些函数,下面再来说明下:

execve我们可以看一下帮助:

最后,再来补充一个知识,在之前我们学过了fcntl函数,可以参考博文:http://www.cnblogs.com/webor2006/p/3500354.html,该函数功能很强大,其中还漏了一个没有学到,就是:

看一下具体代码:

编译运行:

如果没有用fcntl设置,我们是能看到./hello程序的输出结果的,这也就是FD_CLOEXEC标志的作用了,它会对exec系列的函数产生影响,记住这点就可以了。

其实,打开一个文件时,也可以带上FD_CLOEXEC:

好了,今天的学习学到这,下节见!

linux系统编程之进程(三)的更多相关文章

  1. linux系统编程之进程(一)

    今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...

  2. linux系统编程之管道(三)

    今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...

  3. linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程

    本节目标: 复制进程映像 fork系统调用 孤儿进程.僵尸进程 写时复制 一,进程复制(或产生)      使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文.进程堆栈. ...

  4. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...

  5. linux系统编程之进程(二):进程生命周期与PCB(进程控制块)

    本节目标: 进程状态变迁 进程控制块 进程创建 进程撤消 终止进程的五种方法 一,进程状态变迁 进程的三种基本状态 就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便 ...

  6. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...

  7. Linux系统编程——Daemon进程

    目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...

  8. linux系统编程之进程(五)

    今天继续学习系统编程,学习的主题还是进程,今天主要讨论的是守护进程相关的概念,开始进入正题: 什么是守护进程:       守护进程的创建步骤: 在描述它之前,首先得先了解两个概念:进程组.会话期: ...

  9. linux系统编程--守护进程,会话,进程组,终端

    终端: 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal), 进程中,控制终端是保存在PCB中的信息,而f ...

随机推荐

  1. WPF外包团队:2019 WPF数据监控系统案例演示

    项目版权均为客户所有,如有WPF项目外包欢迎联系我们. QQ:372900288 TEL:13911652504 WX:Liuxiang0884

  2. 面试之哈希表leetcode

    1 案例1 leetcode-----242 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t ...

  3. Qt5 QtQuick系列----QtQuick的Secne Graph剖析(1)

    教是言词, 实不是道,道本无言, 言说是妄.------- 达摩 Qt 5提出了一个新的渲染底层,以替代Qt4时期的Graphics View,这个渲染底层就是Scene Graph.Scene Gr ...

  4. linux U盘 硬盘 unable to mount

    转自aaa小菜鸡 出现原因: 上次文件没拷完就拔了U盘 参考: 解决Ubuntu挂载U盘失败的解决方法 Linux下无法挂载U盘 解决: 1.sudo fdisk -l列出当前系统下的文件设备 2.s ...

  5. [转帖]keepalived工作原理和配置、使用

    keepalived工作原理和配置.使用 https://www.iteye.com/blog/aoyouzi-2288124 keepalived是什么 keepalived是集群管理中保证集群高可 ...

  6. day32——进程、操作系统

    day32 进程的基础 程序 一堆静态的代码文件 进程 一个正在运行的程序进程.抽象的概念 被谁运行? 由操作系统操控调用交于CPU运行 ​ 操作系统 管理控制协调计算机中硬件与软件的关系 操作系统的 ...

  7. MySQL 总结篇 [在Oracle基础上学习的MySQL]

    一.学习环境 MySQL 5.7社区版 Navicat for MySQL 百度网盘下载链接:https://pan.baidu.com/s/1yGnznwoZ8CaMgrCsDBhKAQ 二.MyS ...

  8. js node md5模块使用问题

    问题描述:md5(123456)得到的结果不是正确的. why? 问题查找: 1)安装路径问题: yarn add md5(md5模块在npmjs中显示每周download人数高达百万,有问题还这么多 ...

  9. (转)Nginx+rtmp+ffmpeg搭建流媒体服务器

    (1)下载第三方扩展模块nginx-rtmp-module # mkdir module && cd module //创建一个存放模块的目录 # wget https://githu ...

  10. 14-4 ADO.NET简介2

    14-4-1Connection连接.关闭数据库 1.为了访问数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的.它有 四种类型的连接方式: SQLConnection AD ...