20155308 加分题-mybash的实现(第五周)
20155308 加分题-mybash的实现(第五周)
实验要求
- 使用fork,exec,wait实现mybash
- 写出伪代码,产品代码和测试代码
- 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)
使用fork,exec,wait实现mybash(代码)
fork
首先用man命令查看fork的使用方法


- 其功能
通过复制调用fork的进程创建一个新进程。
- 返回值
创建子进程成功时,fork在父进程中返回子进程的pid,在子进程中返回0。失败时,在父进程中返回-1,无子进程被创建,相应的错误在errno中设置。
- fork创建子进程代码

将代码中加入sleep(1)重新编译并运行程序得到运行结果:

其不同的原因为当程序执行fork()语句后就又多出了一个进程,进程的运行符合“多个进程的运行方式”。
exec()
首先用man命令查看exec的使用方法


- 其功能
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。
- 返回值
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错则返回-1,所以exec函数只有出错的返回值而没有成功的返回值。
- 验证exec功能代码

当进程调用execv函数时,该进程的用户空间代码和数据完全被exec_call替换,从exec_call的启动例程开始执行。调用execv进程后面的代码没有被执行。所以出现了错误。
- 解决方法
参考了
http://blog.csdn.net/misskissc/article/details/38467801
这篇博客。
在“fork创建子进程代码”中加入execv函数:

wait
首先用man命令查看wait的使用方法


- 功能
对于一个已经终止的子进程,用wait能够让系统释放与子进程相关的资源;如果不用wait则终止的进程会变为僵尸进程。
- 返回值
若调用成功则返回清理掉的子进程id,若调用出错则返回-1。
mybash代码
- 伪代码
- 对用户输入的命令进行解析
- 检查用户输入的命令是否为内置的Linux命令
- 构造argv向量
- 结果

问题
为什么不能成功打印出来?
- 解决
上网找了一下,不知道为什么,之后看了一下同学的博客,发现在前面加上“/bin”就可以了。但是不是很理解。

实验中的问题
见上面实验过程
感想
本次加分题是复习了老师课上所讲的内容,重新练习了关于进程的一些知识点。虽然自己课上也听了一些,但是感觉掌握知识的能力不强,所以在课下练习时也出现了一些问题。但是我通过网上一些知识点的查找,最终了解了这部分的内容。
20155308 加分题-mybash的实现(第五周)的更多相关文章
- 20155326 第五周加分题--mybash的实现
第五周加分题--mybash的实现 题目要求 1.使用fork,exec,wait实现mybash 2.写出伪代码,产品代码和测试代码 3.发表知识理解,实现过程和问题解决的博客(包含代码托管链接) ...
- 第五周加分题--mybash的实现
第五周加分题--mybash的实现 题目要求 1.使用fork,exec,wait实现mybash 2.写出伪代码,产品代码和测试代码 3.发表知识理解,实现过程和问题解决的博客(包含代码托管链接) ...
- 第五周 加分题-mybash的实现
第五周 加分题-mybash的实现 使用fork,exec,wait实现mybash 产品代码 #include <stdio.h> #include <stdlib.h> # ...
- 2017-2018-1 20155320 第五周 加分题-mybash的实现
2017-2018-1 20155320 第五周 加分题-mybash的实现 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客( ...
- 2017-2018-1 20155239 《信息安全系统设计基础》第五周学习总结+mybash的实现
2017-2018-1 20155239 <信息安全系统设计基础>第五周学习总结+mybash的实现 mybash的实现 使用fork,exec,wait实现mybash 写出伪代码,产品 ...
- 20155308 加分项——C语言实现Linux的pwd命令
20155308 加分项--C语言实现Linux的pwd命令 实现要求 学习pwd命令 什么是pwd pwd' 代表的是'Print Working Directory'(打印当前目录).如它的名字那 ...
- 20155322 2017-2018-1 《信息安全系统设计》第五周 MyBash实现
#20155322 2017-2018-1<信息安全系统设计>第五周 MyBash实现 [博客目录] 实现要求 相关知识 bash fork exec wait 相关问题 fork返回两次 ...
- 第五周 mybash的实现
第五周 mybash的实现 1. 使用fork,exec,wait实现mybash 2. 写出伪代码,产品代码和测试代码 3. 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 1. for ...
- 20155308 2016-2017-2 《Java程序设计》第9周学习总结
20155308 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 16.1 JDBC入门 驱动的四种类型 JDBC-ODBC Bridg ...
随机推荐
- kvm 启动libvirtd时出现错误
kvm 启动libvirtd市出现错误: /etc/init.d/libvirtd start启动 libvirtd 守护进程:libvirtd: relocation error: libvirtd ...
- 配置consul为windows服务
安装consul并配置为系统服务下载地址https://www.consul.io/downloads.html 配置系统服务1.拷贝consul.exe的目录 如:E:\Consul\consule ...
- vue的项目
vue的项目打开也是非常具有解耦性的 最重要的就是src目录了 我们的入口在main中 main是你的实例化vue app中就是我们的每一块田地是我们的vue实例对这个的操作 ,index因为是 ...
- 将Model对象转换成json文本或者json二进制文件
将Model对象转换成json文本或者json二进制文件 https://github.com/casatwy/AnyJson 注意:经过测试,不能够直接处理字典或者数组 主要源码的注释 AJTran ...
- elastic search报错——“failed to obtain node locks”
启动时报错信息: 这里写图片描述 寻找主要信息:failed to obtain node locks这里写图片描述简单理解为:绑定节点失败!!! 百度后,好多人同样遇到了这个问题,导致的原因可能是因 ...
- 高性能网站架构缓存——redis集群
相信你已经对redis有一定的了解,并能够安装上,进行简单的使用了,但是在咱们的实际应用中,使用redis肯定不会使用单机版,不光是redis不能使用单机版,其他的也不会使用,所以今天我们来说一下re ...
- Lonely(非洲NANA作品)
Lonely(非洲NANA作品) 编辑 Lonely NANA,出生于1968年10月5日的非洲加纳.来自于加纳的NANA出身于一个富有的家庭,但是父亲在他小时候离他们而去,母亲带着年幼的NANA定居 ...
- fun()可拆分赋值 fun()可以拆, 变成 fun 和 括号, fun 可以赋值
2. 函数名可以赋值给其他变量 ---> 就是 func()可以拆 def fun (): print("哈哈") a = fun # 拆分 fun()的 fu ...
- SDN上机第二次作业
SDN第二次上机作业 1.安装floodlight 参考链接:http://www.sdnlab.com/19189.html 2.生成拓扑并连接控制器floodlight,利用控制器floodlig ...
- [转] pom.xml 配置详解
From:http://blog.csdn.net/ithomer/article/details/9332071 Maven是一个项目管理工具,通过pom.xml来实现. pom.xml 配置文件 ...