# 写在开头的话

MIT6.824 这门课我已经做完一半内容了,而且 lab 也只剩下最后的 lab4。所以我在想似乎现在是时候开启新的副本了。

我知道上一个副本我还没打通关,而且 MIT6.824 是大副本,整个 3 月份加上读论文,我也并没有很大把握能够把这么课程干掉。我的规划里面这么课程是作为我的核心课程,自然也要精细一些。但是 6.S081 的难度并没有那么大,如果时间安排的好的话,在 4 月中旬我是可以结束这门课的。

关于我为什么要学这么课。

一个很大的原因就是直接关于操作系统的知识太薄弱了,但是如果要走向数据库、分布式方向就必须和底层也就是操作系统打交道。所以操作系统不得不学。这门课程也是一个本科生课程,我的学习能力还是有点自信的。

MIT6.824 和 MIT6.S081,争取全部在四月中结束。然后就是愉快的 CPP 康复训练了。五月争取学完 CMU445。如果那时候没有找到实习就接着学 CMU721。

ok,你可以做到的对吧?

# 命令

# fork

image-20220314104858521

fork 在子进程中返回 0,在父进程中返回子进程的 pid。

# exec

image-20220314105419719

exec 就是将当前进程内存清空,执行新的命令。这里就是会去执行 echo 命令。但是需要注意的是,这里是清空当前进程的内存,而不是另开一个新进程。如果 exec 执行成功,exec 会执行 exit (0)。如果 exec 执行失败,就会执行 exec 接下来的代码,也就是 printf。

# forkexec

image-20220314110105319

当前进程 fork 了一个子进程,子进程使用 exec 清空了当前进程内存,并且执行了 echo。如果 exec 执行失败,才会执行下面的 printf 和 exit。

而父进程使用 wait 等待子进程传回结束的 status。如果子进程执行 exec 结束,也就是 exit (0),返回 status 0。如果执行 exec 失败就会是 exit (1)。

# redirect

image-20220314111428220

这里将子进程的 output 重定向 output.txt。主要,fork 会复制父进程的所有文件描述符,但是维护了一个复制的文件描述符表,这意味着即使我们修改了子进程的文件描述符,不会影响到父进程。