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

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

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

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

    实验中的问题

    见上面实验过程

    感想

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

  • 相关阅读:
    POJ 2234 Matches Game 尼姆博弈
    复杂问题的简单抽象:魔兽世界中的兔子们
    POJ 2368 巴什博奕
    POJ 1067 取石子游戏 威佐夫博弈
    Codeforces 704A Thor 队列模拟
    Codeforces 703B Mishka and trip
    P1447 [NOI2010]能量采集
    P2652 同花顺
    P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G
    P2515 [HAOI2010]软件安装
  • 原文地址:https://www.cnblogs.com/JIUSHA/p/7999182.html
Copyright © 2020-2023  润新知