文章目录

  • 进程控制的简单相关回顾
    • 环境变量怎么读取的,如何由父进程让子进程拿到呢?
  • minishell代码排错
    • 为什么子进程获取不到父进程的环境变量呢?
    • 程序替换不会替换父进程的环境变量?
  • minishell最终完整代码总览

进程控制的简单相关回顾

我们知道,shell执行的命令,通常有两种:
1:第三方提供对应的在磁盘中有具体二进制的可执行程序**(由子进程执行)。**
2:shell命令中,自己实现相关方法等,因为对于有些影响shell本身的命令通常由父进程执行,我们通常称之为内置命令。例如 :cd命令,export命令等。

环境变量怎么读取的,如何由父进程让子进程拿到呢?

一般而言,用户通过shell命令由父进程通过export命令传递给命令行参数数组后通过判断调用getenv()函数接口,将存放在缓冲区里面的环境变量内容地址导入到当前shell的环境变量中。进而创建一个环境变量后再进行重新输入命令行参数,进行对代码的解析,创建子进程等。

minishell代码排错

但是当我们使用export命令调用系统接口命令,当子进程执行进程替换去调用父进程时,子进程执行的新程序去并没有获取到由父进程继承的环境变量。

运行结果如下
获取到的环境变量为null.

为什么子进程获取不到父进程的环境变量呢?

我们怀疑是因为用户在使用export 增加环境变量时,调用系统接口产生错误,导致环境变量没有导入到当前shell中。

所以我们决定在调用系统接口putenv函数后,打印查看当前shell的环境变量。

运行结果如下
我们成功将环境变量myval导入到当前shell的环境变量中。

那么,既然在导入环境变量后,当前shell已经有了需要的环境变量,那么为什么子进程执行test.c获取环境变量时却获取不到呢?
所以我们怀疑是子进程在进行进程替换后执行新程序时发生了问题。所以,我们要排除该因素。

我们决定,在子进程执行进程替换前便读取父进程导入的环境变量。

运行结果如下
在执行进程替换前,依旧无法获取由子进程继承自父进程的环境。

那么有没有可能子进程不能获取环境变量所导致的呢?
为了应对这一问题,我们在进程替换前求取系统默认的环境命令PATH,测试它是否能够求出来。
运行结果如下
在子进程中依旧能够获取到系统默认的环境变量PATH。

小总结
经由上述操作,我们既排除了父进程调用系统命令putenv函数调用失败的问题,也排除了子进程执行进程替换后的因素和子进程是否能获取环境变量等问题。问题范围一步步减小。

此时,针对于这种情况,那就最有可能是函数所传的参数有问题
我们知道putenv函数实际上是将储存在cmd_line缓冲的环境变量的地址导入当前shell的命令行参数数组中。但是有可能在export导入环境变量时,子进程在执行新的程序时,父进程又将cmd_line缓冲区的进行初始化为’\0’了,所以当我们再使用getenv获取字符串时,通过当前环境变量的地址找到cmd_line缓冲区的值为’\0’。所以我们获取的环境 变量的值可能就为null了。

针对这一情况,我们就不能再让子进程执行新程序时让父进程初始化cmd_line缓冲区了。所以我们可以尝试将cmd_line缓冲区的内容再重新拷贝一份。

运行结果如下
此时获取环境变量可执行程序test成功获取到环境变量内容。


总结
在进行程序排错时,我们要不断去逐一排查一段程序有可能出现的问题,通过控制变量的方法不断缩小所要查找的范围。最后确定该问题后从该问题所关联的代码中查找。

程序替换不会替换父进程的环境变量?

通过上诉论述及其配合我们知道的有关知识,比如minishell中子进程执行进程替换会将父基础的代码和数据替换,可是存储在父进程缓冲区里面的环境变量有关数据并没有被替换掉。
这是属于进程替换的一种特殊情况,我们可以理解成在执行进程替换的时候,并不是将父所有的数据和代码都替换掉,对于系统有关的环境变量与数据并不需要新程序替换。这也体现出环境变量具有全局属性。

minishell最终完整代码总览

进程控制(二)——minishell延续相关推荐

  1. 进程控制(二)与linux下的自有服务

    一.进程动态信息查看top 第一部分 统计信息 [root@yunwei1 ~]# top top - 19:22:52 up 1:32, 2 users, load average: 0.00, 0 ...

  2. 进程控制 (二) Others

    1. 执行新程序 只列出几个常用的函数: #include <unistd.h> int execve(const char *path, char * const argv[], cha ...

  3. (王道408考研操作系统)第二章进程管理-第一节3:进程控制(配合Linux讲解)

    文章目录 一:如何实现进程控制 二:进程控制原语 (1)进程创建 A:概述 B:补充-Linux中的创建进程操作 ①:fork() ②:fork()相关问题 (2)进程终止 A:概述 B:补充-僵尸进 ...

  4. vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制

    Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...

  5. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 main函数的多种 ...

  6. linux系统进程控制实验报告,Linux进程控制实验报告.doc

    里奴性进程控制实验报告 实验名称: Linux进程控制 实验要求:一.编写一个Linux系统C程序,由父亲创建2个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结 ...

  7. 计算机实验进程管理与虚拟机,虚拟机VMware进程控制实验.docx

    虚拟机VMware进程控制实验 实验6:进程控制操作 1.实验目的 1.了解进程的概念: 2.熟悉Linux的前台与后台进程控制操作: 3.掌握利用进程监控工具来维护系统的正常运行: 2.实验内容 1 ...

  8. 进程管理(二十二)—CFS调度器

    CFS是内核使用的一种调度器或调度类,它主要负责处理三种调度策略:SCHED_NORMAL.SCHED_BATCH和SCHED_IDLE.调度器的核心在挑选下一个运行的进程时有可能会遍历所有的调度类别 ...

  9. Linux——详解进程控制之等待

    进程等待是进程控制中非常重要的一环,这关系着多进程之间的联动. 目录 一.概念 二.wait 三.waitpid (一).  pid_t pid (二).  int* status ※ ①退出码 ②退 ...

最新文章

  1. DIV+CSS到底是什么?
  2. spring boot+shiro中使用@RequiresRoles不生效,访问报错404
  3. [转载] 七龙珠第一部——第033话 龙的传说
  4. 【玩转Eclipse】——eclipse实现代码块折叠-类似于VS中的#region……#endregion
  5. 改变自己------每天进步一点点
  6. linux加密框架 crypto 算法管理 - 哈希算法应用实例
  7. matlab 导入元胞,MATLAB导入xls文件以及cell的使用方法
  8. oracle数据库read only,oracle 报错Linux-x86_64 Error: 30: Read-only file system
  9. 《汇编语言》王爽—第五章实验三详解
  10. 0基础入门前端,会遇到哪些困难?
  11. 剑指offer——面试题41-2:和为S的两个数字
  12. ARM学习之看门狗定时器
  13. 【Python实战】用Scrapy编写“1024网站种子吞噬爬虫”,送福利
  14. 一款手机电脑都能用的进销存财务软件
  15. ViewPager中ViewPager的使用
  16. 案例 | 群硕助力凯德打造智慧楼宇,引领地产领域运营创新之路
  17. Xcode各种iOS版本模拟器的安装使用
  18. 谷粒学院——Day09【整合阿里云视频点播】
  19. android 动画坐标,android TranslateAnimation动画执行时的坐标获取。
  20. CSAPP实验1:datalab

热门文章

  1. html的样式下拉框的联动,Web框架Ajax实现html下拉框联动
  2. linux的firewall火墙管理
  3. 差分运放公式推导-运算放大器
  4. linux安装oracle12c
  5. Android实用的优惠券控件
  6. 74LS273内部逻辑结构
  7. Android内存优化(六)LeakCanary使用详解
  8. 页面置换之最近最久未使用置换算法
  9. 黄金斗士原生android,联想黄金斗士S8 (S898T+)官方固件rom系统刷机包
  10. 回忆2018年AI入门学习路线