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代码

  • 伪代码
  1. 对用户输入的命令进行解析
  2. 检查用户输入的命令是否为内置的Linux命令
  3. 构造argv向量

为什么不能成功打印出来?

  • 解决
    上网找了一下,不知道为什么,之后看了一下同学的博客,发现在前面加上“/bin”就可以了。但是不是很理解。

实验中的问题

见上面实验过程

感想

本次加分题是复习了老师课上所讲的内容,重新练习了关于进程的一些知识点。虽然自己课上也听了一些,但是感觉掌握知识的能力不强,所以在课下练习时也出现了一些问题。但是我通过网上一些知识点的查找,最终了解了这部分的内容。

最新文章

  1. 【Knockout.js 学习体验之旅】(1)ko初体验
  2. weex append
  3. linux 代码分析工具 gprof - 以wpa_supplicant为例
  4. C语言接口与实现实例
  5. crontab 例行性排程
  6. dom 中事件
  7. 关于InputStream.read()方法的阻塞原理的测试
  8. Oracle“死锁”模拟
  9. Dubbo使用详解及环境搭建
  10. EasyUI--datebox设置默认时间
  11. Appium python自动化测试系列之混合app实战(十一)
  12. 教你用命令行激活win10系统
  13. 读生产环境下go语言最佳实践有感
  14. GDB 资料汇总
  15. Java移位运算符详解实例
  16. 在Web界面中实现Excel数据大量导入的处理方式
  17. VUE错误码Attribute ':sizeOpts' must be hyphenated
  18. 数据库的Connection、Cursor两大对象
  19. 包建强的培训课程(11):iOS Runtime实战
  20. JAVA核心技术I---JAVA基础知识(不可变对象和字符串)

热门文章

  1. 2.HTML标签
  2. C#实体类对象修改日志记录
  3. C/C++内存分区
  4. 使用SharpZipLib压缩与解压文件
  5. 使用Membership,您的登录尝试不成功。请重试"的解决方法
  6. 向服务器post或者get数据返回
  7. [翻译] PPiAwesomeButton
  8. [C++] 用Xcode来写C++程序[6] Name visibility
  9. 使用FBTweak
  10. 清除右键菜单CMD入口