<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
    <title>whx&#x27;s Blog - 学习笔记</title>
    <subtitle>记录生活</subtitle>
    <link rel="self" type="application/atom+xml" href="https://whx828.com/tags/xue-xi-bi-ji/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://whx828.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2023-05-07T00:00:00+00:00</updated>
    <id>https://whx828.com/tags/xue-xi-bi-ji/atom.xml</id>
    <entry xml:lang="zh-CN">
        <title>xv6 学习记录</title>
        <published>2023-05-07T00:00:00+00:00</published>
        <updated>2023-05-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://whx828.com/posts/xv6-learning/"/>
        <id>https://whx828.com/posts/xv6-learning/</id>
        
        <content type="html" xml:base="https://whx828.com/posts/xv6-learning/">&lt;blockquote&gt;
&lt;p&gt;本文会不定期更新&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;最近（就这两天）在学习 MIT 的 &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pdos.csail.mit.edu&#x2F;6.S081&#x2F;2021&#x2F;&quot;&gt;6.S081&lt;&#x2F;a&gt;，打算补一补操作系统的课，毕竟我对操作系统还是很感兴趣的（&lt;del&gt;至于以前的坑嘛，笑&lt;&#x2F;del&gt;）。&lt;&#x2F;p&gt;
&lt;p&gt;大致翻了下 6.S081 的组成：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;课程视频：https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=L6YqHxYHa7A&lt;&#x2F;li&gt;
&lt;li&gt;课程教材：https:&#x2F;&#x2F;pdos.csail.mit.edu&#x2F;6.828&#x2F;2021&#x2F;xv6&#x2F;book-riscv-rev2.pdf&lt;&#x2F;li&gt;
&lt;li&gt;课程作业：https:&#x2F;&#x2F;pdos.csail.mit.edu&#x2F;6.828&#x2F;2021&#x2F;schedule.html&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;如果要把课程视频一一看过去太累，好在已经有好心人提供了课程视频的&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mit-public-courses-cn-translatio.gitbook.io&#x2F;mit6-s081&#x2F;&quot;&gt;中文字幕翻译&lt;&#x2F;a&gt;，配合官方教材，可以在不看视频的情况下大致走一遍，对我而言够用了。&lt;&#x2F;p&gt;
&lt;p&gt;走完字幕后需要做一些 lab 练习才能巩固好所学，却没想到标注 easy 的 lab，其实也不是那么 easy。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lab-xv6-and-unix-utilities&quot;&gt;Lab: Xv6 and Unix utilities&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;boot-xv6-easy&quot;&gt;Boot xv6 (easy)&lt;&#x2F;h3&gt;
&lt;p&gt;这个小 lab 是获取 xv6 的实验环境，做 xv6 实验所用的环境并不是 GitHub 上的那个仓库，而是需要你手动 clone 这个：&lt;code&gt;git clone git:&#x2F;&#x2F;g.csail.mit.edu&#x2F;xv6-labs-2020&lt;&#x2F;code&gt;，之后你可以切到当前 lab 的分支：&lt;code&gt;git checkout util&lt;&#x2F;code&gt;，做什么实验就切到什么分支，非常方便。&lt;br &#x2F;&gt;
之后是最常用的命令：&lt;code&gt;make qemu&lt;&#x2F;code&gt;，顺利的话你就得到这么一堆玩意：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;riscv64-unknown-elf-gcc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -Wall -Werror -O -fno-omit-frame-pointer -ggdb -gdwarf-2 -DSOL_UTIL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie   -c -o user&#x2F;pingpong.o user&#x2F;pingpong.c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;riscv64-unknown-elf-ld&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -z max-page-size=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;4096&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -N -e main -Ttext&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -o user&#x2F;_pingpong user&#x2F;pingpong.o user&#x2F;ulib.o user&#x2F;usys.o user&#x2F;printf.o user&#x2F;umalloc.o&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;riscv64-unknown-elf-objdump&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -S user&#x2F;_pingpong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; user&#x2F;pingpong.asm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;riscv64-unknown-elf-objdump&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -t user&#x2F;_pingpong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; sed &amp;#39;1,&#x2F;SYMBOL TABLE&#x2F;d; s&#x2F; .* &#x2F; &#x2F;; &#x2F;^$&#x2F;d&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; user&#x2F;pingpong.sym&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;mkfs&#x2F;mkfs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; fs.img README  user&#x2F;xargstest.sh user&#x2F;_cat user&#x2F;_echo user&#x2F;_forktest user&#x2F;_grep user&#x2F;_init user&#x2F;_kill user&#x2F;_ln user&#x2F;_ls user&#x2F;_mkdir user&#x2F;_rm user&#x2F;_sh user&#x2F;_sleep user&#x2F;_pingpong user&#x2F;_primes user&#x2F;_stressfs user&#x2F;_usertests user&#x2F;_grind user&#x2F;_wc user&#x2F;_zombie&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;nmeta&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 46&lt;&#x2F;span&gt;&lt;span&gt; (boot,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; super, log blocks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; inode blocks 13, bitmap blocks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;) blocks 954 total 1000&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;balloc:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; first&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 727&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; blocks have been allocated&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;balloc:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; write bitmap block at sector&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 45&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;qemu-system-riscv64&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -machine virt -bios none -kernel kernel&#x2F;kernel -m 128M -smp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;xv6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; kernel is booting&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;hart&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; starting&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;hart&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; starting&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;init:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; starting sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;$&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;才怪！在我的 MacBook 上卡住了，具体修改请看：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;diff --git a&#x2F;kernel&#x2F;kernelvec.S b&#x2F;kernel&#x2F;kernelvec.S&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;index 3370ae5..3e9d3e9 100644&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; a&#x2F;kernel&#x2F;kernelvec.S&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++ b&#x2F;kernel&#x2F;kernelvec.S&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span&gt; -85,11 +85,6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;span&gt; kernelvec:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         &#x2F;&#x2F; return to whatever we were doing in the kernel.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         sret&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; help: if you hit these, an unexpected exception&#x2F;interrupt happened in M-mode.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; use `info registers` in the qemu monitor to get the relevant CSRs.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-unexpected_exc: j unexpected_exc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-unexpected_int: j unexpected_int&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         #&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         # machine-mode timer interrupt.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         #&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span&gt; -106,15 +101,6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;span&gt; timervec:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         sd a2, 8(a0)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         sd a3, 16(a0)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        csrr a1, mcause&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        &#x2F;&#x2F; we should not get exceptions in M-mode. if we do, something went&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        &#x2F;&#x2F; very wrong and we should explicitly jump to an infinite loop for the&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        &#x2F;&#x2F; purpose.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        bgez a1, unexpected_exc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        li a2, (1&amp;lt;&amp;lt;63 | 7)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        &#x2F;&#x2F; likewise for any interrupts that are not machine timer interrupts.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-        bne a1, a2, unexpected_int&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         # schedule the next timer interrupt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         # by adding interval to mtimecmp.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         ld a1, 32(a0) # CLINT_MTIMECMP(hart)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span&gt; -124,7 +110,7&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;span&gt; timervec:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         sd a3, 0(a1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         # raise a supervisor software interrupt.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-           li a1, 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;+       li a1, 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         csrw sip, a1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         ld a3, 16(a0)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;diff --git a&#x2F;kernel&#x2F;riscv.h b&#x2F;kernel&#x2F;riscv.h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;index 5f6c3d9..0aec003 100644&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; a&#x2F;kernel&#x2F;riscv.h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++ b&#x2F;kernel&#x2F;riscv.h&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span&gt; -38,29 +38,6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;span&gt; w_mepc(uint64 x)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   asm volatile(&amp;quot;csrw mepc, %0&amp;quot; : : &amp;quot;r&amp;quot; (x));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; physical memory protection CSRs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-#define PMP_R (1L &amp;lt;&amp;lt; 0)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-#define PMP_W (1L &amp;lt;&amp;lt; 1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-#define PMP_X (1L &amp;lt;&amp;lt; 2)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; naturally aligned power of two&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-#define PMP_MATCH_NAPOT (3L &amp;lt;&amp;lt; 3)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; we only implement accessing one PMP register&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; write to the first 8 PMP configuration registers&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-static inline void&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-w_pmpcfg0(uint64 x)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    asm volatile(&amp;quot;csrw pmpcfg0, %0&amp;quot; : : &amp;quot;r&amp;quot; (x));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; write to the address for PMP region 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-static inline void&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-w_pmpaddr0(uint64 x)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    asm volatile(&amp;quot;csrw pmpaddr0, %0&amp;quot; : : &amp;quot;r&amp;quot; (x));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &#x2F;&#x2F; Supervisor Status Register, sstatus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; #define SSTATUS_SPP (1L &amp;lt;&amp;lt; 8)  &#x2F;&#x2F; Previous mode, 1=Supervisor, 0=User&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;diff --git a&#x2F;kernel&#x2F;start.c b&#x2F;kernel&#x2F;start.c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;index 1c9fffc..4eb6c2d 100644&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; a&#x2F;kernel&#x2F;start.c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+++ b&#x2F;kernel&#x2F;start.c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span&gt; -7,8 +7,6&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; void main();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; void timerinit();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-static void pmpinit();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &#x2F;&#x2F; entry.S needs one stack per CPU.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; __attribute__ ((aligned (16))) char stack0[4096 * NCPU];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span&gt; -47,36 +45,10&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;span&gt; start()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   int id = r_mhartid();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   w_tp(id);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-  &#x2F;&#x2F; allow access to all physical memory by S mode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-  pmpinit();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   &#x2F;&#x2F; switch to supervisor mode and jump to main().&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   asm volatile(&amp;quot;mret&amp;quot;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; configures the pmp registers trivially so we can boot. it is not permitted&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; to jump to S mode without having these configured as instruction fetch will&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; fail, however we do not actually use them for protection in xv6, so we just&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; need to put something trivial there.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; see section 3.6.1 &amp;quot;Physical Memory Protection CSRs&amp;quot; in the RISC-V privileged&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; specification (v20190608)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; &amp;quot;If no PMP entry matches an M-mode access, the access succeeds. If no PMP&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; entry matches an S-mode or U-mode access, but at least one PMP entry is&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&#x2F;&#x2F; implemented, the access fails.&amp;quot; (3.6.1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-static void&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-pmpinit()&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    &#x2F;&#x2F; see figure 3.27 &amp;quot;PMP address register format, RV64&amp;quot; and table 3.10 &amp;quot;NAPOT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    &#x2F;&#x2F; range encoding in PMP address and configuration registers&amp;quot; in the RISC-V&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    &#x2F;&#x2F; privileged specification&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    &#x2F;&#x2F; we set the bits such that this matches any 56-bit physical address&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    w_pmpaddr0((~0ULL) &amp;gt;&amp;gt; 10);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    &#x2F;&#x2F; then we allow the access&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-    w_pmpcfg0(PMP_R | PMP_W | PMP_X | PMP_MATCH_NAPOT);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &#x2F;&#x2F; set up to receive timer interrupts in machine mode,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &#x2F;&#x2F; which arrive at timervec in kernelvec.S,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &#x2F;&#x2F; which turns them into software interrupts for&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;一顿修改后编译终于不再卡住了（觉得乱没关系，看后文就好），但是我调试的时候有个奇怪的问题——用 gdb 打印的时候会报：&lt;code&gt;dwarf2_find_location_expression: Corrupted DWARF expression.&lt;&#x2F;code&gt; 的错。&lt;br &#x2F;&gt;
最开始我以为这是 macOS 的问题，想换到 Ubuntu，但我的 Ubuntu 版本是 18.04，而 Xv6 在 Ubuntu 上的安装需要：&lt;code&gt;sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu&lt;&#x2F;code&gt;，其中 &lt;code&gt;qemu-system-misc&lt;&#x2F;code&gt; 需要 Ubuntu 的版本为 20 以上，所以我继续回来在 macOS 上想办法，最后在这个 &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mit-pdos&#x2F;xv6-riscv&#x2F;pull&#x2F;129&quot;&gt;PR&lt;&#x2F;a&gt; 中找到了答案：&lt;&#x2F;p&gt;
&lt;p&gt;修改 makefile：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- CFLAGS = -Wall -Werror -Wno-error=infinite-recursion -O -fno-omit-frame-pointer -ggdb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;+ CFLAGS = -Wall -Werror -Wno-error=infinite-recursion -O -fno-omit-frame-pointer -ggdb -gdwarf-2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;然后重新编译：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;make clean &amp;amp;&amp;amp; make CPUS=1 qemu-gdb&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;问题解决！&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;悲报：其实你不用像我这么改，因为我所遇到的问题似乎都被人解决了，只要你把 clone 的 &lt;code&gt;2020&lt;&#x2F;code&gt; 换成 &lt;code&gt;2021&lt;&#x2F;code&gt; 即可，悲伤，两天白玩。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;现在终于可以敲代码做 lab 了。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sleep-easy&quot;&gt;sleep (easy)&lt;&#x2F;h3&gt;
&lt;p&gt;Implement the UNIX program sleep for xv6; your sleep should pause for a user-specified number of ticks. A tick is a notion of time defined by the xv6 kernel, namely the time between two interrupts from the timer chip. Your solution should be in the file user&#x2F;sleep.c.&lt;br &#x2F;&gt;
为 xv6 实现 UNIX 程序 sleep；您的 sleep 应暂停用户指定的 tick 数。tick 是由 xv6 内核定义的时间概念，即来自计时器芯片的两个中断之间的时间。您的解决方案应位于文件 user&#x2F;sleep.c 中。&lt;&#x2F;p&gt;
&lt;p&gt;Some hints:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Before you start coding, read Chapter 1 of the xv6 book.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Look at some of the other programs in user&#x2F; (e.g., user&#x2F;echo.c, user&#x2F;grep.c, and user&#x2F;rm.c) &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    to see how you can obtain the command-line arguments passed to a program.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    If the user forgets to pass an argument, sleep should print an error message.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    The command-line argument is passed as a string; you can convert it to an integer using atoi (see user&#x2F;ulib.c).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Use the system call sleep.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    See kernel&#x2F;sysproc.c for the xv6 kernel code that implements the sleep system call (look for sys_sleep), &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    user&#x2F;user.h for the C definition of sleep callable from a user program, &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    and user&#x2F;usys.S for the assembler code that jumps from user code into the kernel for sleep.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Make sure main calls exit() in order to exit your program.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Add your sleep program to UPROGS in Makefile; once you&amp;#39;ve done that, &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    make qemu will compile your program and you&amp;#39;ll be able to run it from the xv6 shell.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Look at Kernighan and Ritchie&amp;#39;s book The C programming language (second edition) (K&amp;amp;R) to learn about C.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这玩意还是相对简单：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;types.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;stat.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;user&#x2F;user.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; argc,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt; char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;argv[])&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (argc &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Usage: sleep x&#x2F;10th of a second...&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    sleep&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;atoi&lt;&#x2F;span&gt;&lt;span&gt;(argv[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;测试一下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;.&#x2F;grade-lab-util&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; sleep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;make:&lt;&#x2F;span&gt;&lt;span&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;kernel&#x2F;kernel&amp;#39; is up to date.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;== Test sleep, no arguments == sleep, no arguments: OK (1.3s) &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;== Test sleep, returns == sleep, returns: OK (1.1s) &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;== Test sleep, makes syscall == sleep, makes syscall: OK (0.8s) &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;搞定。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pingpong-easy&quot;&gt;pingpong (easy)&lt;&#x2F;h3&gt;
&lt;p&gt;Write a program that uses UNIX system calls to ‘ping-pong’ a byte between two processes over a pair of pipes, one for each direction. The parent should send a byte to the child; the child should print “&amp;lt;pid&amp;gt;: received ping”, where &amp;lt;pid&amp;gt; is its process ID, write the byte on the pipe to the parent, and exit; the parent should read the byte from the child, print “&amp;lt;pid&amp;gt;: received pong”, and exit. Your solution should be in the file user&#x2F;pingpong.c.&lt;br &#x2F;&gt;
编写一个程序，该程序使用 UNIX 系统调用，通过一对管道在两个进程之间“乒乓”一个字节，每个方向一个。父进程应该向子进程发送一个字节；子进程应打印“&amp;lt;pid&amp;gt;: received ping”，&amp;lt;pid&amp;gt;表示其进程ID，后将管道上的字节写入父进程，然后退出；父进程应从子进程的 pipe 中读取字节，打印“&amp;lt;pid&amp;gt;: received ping”，然后退出。您的解决方案应位于文件 user&#x2F;pingpong.c 中。&lt;&#x2F;p&gt;
&lt;p&gt;Some hints:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Use pipe to create a pipe.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Use fork to create a child.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Use read to read from the pipe, and write to write to the pipe.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Use getpid to find the process ID of the calling process.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Add the program to UPROGS in Makefile.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    User programs on xv6 have a limited set of library functions available to them. &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    You can see the list in user&#x2F;user.h; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    the source (other than for system calls) is in user&#x2F;ulib.c, user&#x2F;printf.c, and user&#x2F;umalloc.c.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个就是并不 easy 的 easy lab 了，最开始的时候怎么都有问题，不是交错打印就是提前退出，上网查找，主流的解决方案是用两个 pipe：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;types.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;user&#x2F;user.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#define&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; READEND 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#define&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; WRITEEND 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; argc,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt; char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;argv[]) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; p1[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; p2[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; pid;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span&gt; buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    pipe&lt;&#x2F;span&gt;&lt;span&gt;(p1);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    pipe&lt;&#x2F;span&gt;&lt;span&gt;(p2);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    pid &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; fork&lt;&#x2F;span&gt;&lt;span&gt;();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (pid &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;    else if&lt;&#x2F;span&gt;&lt;span&gt; (pid &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p1[WRITEEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p2[READEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        read&lt;&#x2F;span&gt;&lt;span&gt;(p1[READEND], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received ping&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        write&lt;&#x2F;span&gt;&lt;span&gt;(p2[WRITEEND],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p1[READEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p2[WRITEEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p1[READEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p2[WRITEEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        write&lt;&#x2F;span&gt;&lt;span&gt;(p1[WRITEEND],&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        read&lt;&#x2F;span&gt;&lt;span&gt;(p2[READEND], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received pong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p1[WRITEEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p2[READEND]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个 lab 如果需要提示，就是用两个 pipe，一个接一个发（没有化很遗憾，对不起马老师）；&lt;br &#x2F;&gt;
但我最开始写的时候想用一个 pipe 就解决问题，所以更接近这个答案：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;types.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;stat.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;user&#x2F;user.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; argc,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt; char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;argv[]) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span&gt; buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;parmsg &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;a&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;chimsg &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;b&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    pipe&lt;&#x2F;span&gt;&lt;span&gt;(p);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;fork&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t read from parent!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;child receive: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%c\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received ping&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;], chimsg,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t write to parent!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;], parmsg,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t write to child!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        wait&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t read from child!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;parent receive: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%c\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received pong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果我一上来就写成这样也不会说这道题难了，我写的是这样的：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;types.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;stat.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;user&#x2F;user.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; argc,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt; char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;argv[]) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span&gt; buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;parmsg &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;a&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;chimsg &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;b&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    pipe&lt;&#x2F;span&gt;&lt;span&gt;(p);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;fork&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t read from parent!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;child receive: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%c\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received ping&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;], chimsg,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t write to parent!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;], parmsg,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t write to child!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t read from child!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;parent receive: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%c\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received pong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        wait&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;区别在于 &lt;code&gt;wait(0)&lt;&#x2F;code&gt; 的位置。我的版本，输出一般是这样的：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;代码会直接阻塞住，为了找出 Bug，我去掉了 &lt;code&gt;wait(0)&lt;&#x2F;code&gt;，输出开始有一些变化了：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;types.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;kernel&#x2F;stat.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;#include&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;user&#x2F;user.h&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; argc,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt; char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;argv[]){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span&gt; buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;parmsg &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;a&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #7FBBB3;&quot;&gt;    char&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;chimsg &lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;b&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;    pipe&lt;&#x2F;span&gt;&lt;span&gt;(p);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;fork&lt;&#x2F;span&gt;&lt;span&gt;()&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t read from parent!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;child receive: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%c\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received ping&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;], chimsg,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t write to parent!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;], parmsg,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t write to child!&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #E67E80;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;read&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;], buf,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E69875;&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt; &amp;quot;Can&amp;#39;t read from child!&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;            exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;parent receive: &lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%c\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, buf[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        close&lt;&#x2F;span&gt;&lt;span&gt;(p[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        printf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;%d&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;: received pong&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: #DBBC7F;&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt; getpid&lt;&#x2F;span&gt;&lt;span&gt;());&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A7C080;&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D699B6;&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;输出是这样的：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;9: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;11: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;13: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ pingpong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;child receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;16: received ping&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;15: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ QEMU: Terminated&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以看到最后还是正常运行了一次，其余都是错误输出，为什么会这样呢？关键在 pipe 上。&lt;&#x2F;p&gt;
&lt;p&gt;在 xv6 中通过系统调用 &lt;code&gt;pipe(int p[])&lt;&#x2F;code&gt; 可以创建一个匿名管道，然后将对应管道读端的文件描述符放入 &lt;code&gt;p[0]&lt;&#x2F;code&gt;，对应管道写端的文件描述符放入 &lt;code&gt;p[1]&lt;&#x2F;code&gt;。&lt;code&gt;p[0]&lt;&#x2F;code&gt; 是具有只读属性的文件描述符，&lt;code&gt;p[1]&lt;&#x2F;code&gt; 是具有只写属性的文件描述符。&lt;&#x2F;p&gt;
&lt;p&gt;匿名管道底下对应的文件没有文件名，因此只能被有亲缘的进程打开。实际情形如下图所示&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;..&#x2F;..&#x2F;images&#x2F;legacy&#x2F;2023&#x2F;pipe.svg&quot; loading=&quot;lazy&quot; &#x2F;&gt; 子进程与父进程之间通过匿名管道通信&lt;&#x2F;p&gt;
&lt;p&gt;为什么子进程不需要等待父进程的写入先完成？&lt;br &#x2F;&gt;
答案是，在管道上的 &lt;code&gt;read&lt;&#x2F;code&gt; 是阻塞的。在没有数据可读时，在管道上的 &lt;code&gt;read&lt;&#x2F;code&gt; 会一直阻塞，直到要么有新的数据被写入，或者管道的所有写端都被关闭。在后者的情况下，&lt;code&gt;read&lt;&#x2F;code&gt; 会返回 0。也正因为这个特性，所有不需要写入数据的子进程，都应该主动关闭掉管道的写端。&lt;&#x2F;p&gt;
&lt;p&gt;在我的程序中出现了这样的输出：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #D3C6AA; background-color: #2D353B;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;parent receive: a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3: received pong&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;一个可能是：&lt;code&gt;else&lt;&#x2F;code&gt; 分支也就是父进程的 &lt;code&gt;write&lt;&#x2F;code&gt; 被同在 &lt;code&gt;else&lt;&#x2F;code&gt; 分支的 &lt;code&gt;read&lt;&#x2F;code&gt;（也就是它自己的）消耗掉了，所以 &lt;code&gt;parent receive&lt;&#x2F;code&gt; 才是 &lt;code&gt;a&lt;&#x2F;code&gt; 而不是 &lt;code&gt;b&lt;&#x2F;code&gt;。&lt;br &#x2F;&gt;
&lt;code&gt;write&lt;&#x2F;code&gt; 操作是在 &lt;code&gt;read&lt;&#x2F;code&gt; 操作之前完成的，因此在 &lt;code&gt;read&lt;&#x2F;code&gt; 操作之前，数据已经被写入管道中，且管道中的数据已经准备好被读取。因此，可以保证在 &lt;code&gt;read&lt;&#x2F;code&gt; 操作中能够读取到 &lt;code&gt;write&lt;&#x2F;code&gt; 操作写入的数据。&lt;br &#x2F;&gt;
正常的程序，父进程写入管道的数据应该被子进程消耗掉才对。如果不加 &lt;code&gt;wait(0)&lt;&#x2F;code&gt;：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;运气好，就像最后一次输出，非常凑巧，顺序恰好和把 &lt;code&gt;wait(0)&lt;&#x2F;code&gt; 放在父进程 &lt;code&gt;write&lt;&#x2F;code&gt; 之后那里的顺序一致：在父进程 &lt;code&gt;write&lt;&#x2F;code&gt; 之后等待子进程退出，这样能够保证父进程的 &lt;code&gt;write&lt;&#x2F;code&gt; 一定是由子进程的 &lt;code&gt;read&lt;&#x2F;code&gt; 消耗掉的，同时子进程 &lt;code&gt;write&lt;&#x2F;code&gt; 一个字节后直接执行结束，父进程就可以 &lt;code&gt;read&lt;&#x2F;code&gt; 到值了；&lt;&#x2F;li&gt;
&lt;li&gt;运气不好，遇到先运行父进程一直到 &lt;code&gt;wait&lt;&#x2F;code&gt; 调用而没来得及运行子进程的情况，就会出现这样的问题：子进程的 &lt;code&gt;read&lt;&#x2F;code&gt; 会一直阻塞，因为父进程的 &lt;code&gt;write&lt;&#x2F;code&gt; 被它自己的 &lt;code&gt;read&lt;&#x2F;code&gt; 给消耗掉了，此时没有谁来再给管道写入值了，再加上子进程还要给父进程 &lt;code&gt;write&lt;&#x2F;code&gt; 一个字节，所以它还不能在开头直接 &lt;code&gt;close(p[1]);&lt;&#x2F;code&gt;，&lt;code&gt;read&lt;&#x2F;code&gt; 返回的第二个条件也不满足，所以子进程的 &lt;code&gt;read&lt;&#x2F;code&gt; 会一直阻塞。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;问题解决。看似很小的问题，其实也有一点原子的味道，如果给 pipe 上锁，是不是就不会出现这个问题了？值得思考。&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
