# 引言 - Open-Source-OS-Training-Camp-2022 文档

Hide navigation sidebar
Hide table of contents sidebar
Toggle table of contents sidebar

# 引言

## 本章导读

本章将基于文件描述符实现父子进程之间的通信机制——管道。 我们还将扩展 `exec` 系统调用，使之能传递运行参数，并进一步改进 shell 程序，使其支持重定向符号 `>` 和 `<` 。

## 实践体验

获取本章代码：

在 qemu 模拟器上运行本章代码参考框架：

    $ git clone ``gitaddr of github-classroom-build-lab4``
    $ cd ``github-classroom-build-lab4``
    $ make setupclassroom_test6  //注意：这一步很重要，是用于github classroom自动评测你的工作。这一步只需在首次克隆项目仓库时执行一次，以后一般就不用执行了，除非 .github/workflows/classroom.yml发生了变化。
    $ cd os7-ref
    $ make run

注解

实验名称 ：实验编号

- lab0-0 : test1

- lab0-1：test2

- lab1：test3

- lab2：test4

- lab3：test5

- lab4：test6

- lab5：test8

在 qemu 模拟器上运行 os7参考框架: ：

    $ cd os7-ref
    $ make run

进入shell程序后，可以运行管道机制的简单测例 `ch7b_pipetest`， `ch7b_pipetest` 需要保证父进程通过管道传输给子进程的字符串不会发生变化。

测例输出大致如下：

    >> ch7b_pipetest
    Read OK, child process exited!
    pipetest passed!
    Shell: Process 2 exited with code 0
    >>

同样的，也可以运行较为复杂的测例 `ch7b_pipe_large_test`，体验通过两个管道实现双向通信。

此外，在本章我们为shell程序支持了输入/输出重定向功能，可以将一个应用的输出保存到一个指定的文件。例如，下面的命令可以将 `ch7b_yield` 应用的输出保存在文件 `fileb` 当中，并在应用执行完毕之后确认它的输出：

    >> ch7b_yield > fileb
    Shell: Process 2 exited with code 0
    >> ch7b_cat fileb
    Hello, I am process 2.
    Back in process 2, iteration 0.
    Back in process 2, iteration 1.
    Back in process 2, iteration 2.
    Back in process 2, iteration 3.
    Back in process 2, iteration 4.
    yield pass.

    Shell: Process 2 exited with code 0
    >>

## os7参考框架:

     ── os7-ref
        └── src
            ├── ...
            ├── fs
            │   ├── inode.rs
            │   ├── mod.rs
            │   ├── pipe.rs(新增：实现了 File Trait 的第三个实现——可用来进程间通信的管道)
            │   └── stdio.rs
            ├── mm
            │   ├── address.rs
            │   ├── frame_allocator.rs
            │   ├── heap_allocator.rs
            │   ├── memory_set.rs
            │   ├── mod.rs
            │   └── page_table.rs
            ├── syscall
            │   ├── fs.rs(修改：添加了sys_pipe和sys_dup)
            │   ├── mod.rs
            │   └── process.rs(修改：sys_exec添加了对参数的支持)
            ├── task
                ├── context.rs
                ├── manager.rs
                ├── mod.rs
                ├── pid.rs
                ├── processor.rs
                ├── switch.rs
                ├── switch.S
                └── task.rs(修改：在exec中将参数压入用户栈中)

    cloc easy-fs os
    -------------------------------------------------------------------------------
    Language                     files          blank        comment           code
    -------------------------------------------------------------------------------
    Rust                            42            317            434           3574
    Assembly                         4             53             26            526
    make                             1             13              4             48
    TOML                             2              4              2             23
    -------------------------------------------------------------------------------
    SUM:                            49            387            466           4171
    -------------------------------------------------------------------------------