category
type
status
date
slug
summary
tags
password
Property
Jan 21, 2026 02:35 PM
icon
Lab1『🎉』
脑溢血的vscode函数定义跳转配置
配置gdb调试环境
pingpong
- 管道特性的思考
只要管道还有至少一个写端未被关闭,即使当前管道为空,读进程也会认为未来可能有数据写入,于是选择阻塞而非放弃。
1. API 设计约定
在 Unix/Linux 系统中,
pipe() 系统调用的设计规范就是:pipefd[0]:读端(read end)
pipefd[1]:写端(write end)
这个约定源于早期的 Unix 设计,已经成为 POSIX 标准的一部分。
2. 记忆方法
0像字母 "O"(代表 "Output from pipe" 或 "Open for reading")
1像数字 "1"(代表 "Input to pipe" 或 "One-way in")
更直观的记忆:
0= stdin(标准输入,用于读)
1= stdout(标准输出,用于写)
primes实验,管道在fork链中的开关情况
如果进程链是 p1 → p2 → p3(即 p1 创建 p2,p2 创建 p3),管道在 p1 中创建,随后 p2 关闭了写端,那么 p3 不会拥有该管道的写端文件描述符。
详细分析:
- 初始状态
p1 调用
pipe(fd),获得两个打开的文件描述符:fd[0](读端)和 fd[1](写端)。- p1 fork 出 p2
p2 继承 p1 的文件描述符副本,因此 p2 也拥有
fd[0] 和 fd[1],两者都处于打开状态。- p2 关闭写端
p2 调用
close(fd[1]),关闭自己持有的写端文件描述符。此时 p2 的文件描述符表中,写端已关闭,但读端 fd[0] 仍打开。- p2 fork 出 p3
p3 继承的是 p2 当前的文件描述符表副本。由于 p2 已关闭写端,p3 只会继承到打开的读端
fd[0],而不会继承写端 fd[1](因为它在 p2 的文件描述符表中已关闭)。关键点:
- 文件描述符的继承是复制当前状态:子进程获得的是父进程调用
fork()时文件描述符表的快照。
- 管道的写端是否仍然存在:虽然 p3 自己没有写端,但管道的写端可能仍在其他进程中打开(例如 p1 可能仍未关闭写端)。不过,p3 自身无法进行写入操作,因为它没有写端的文件描述符。
- 管道生命周期:只要至少有一个写端保持打开(无论在哪个进程),管道的读端就不会看到 EOF。如果 p1 也关闭了写端,那么当所有写端关闭后,读端在读取完剩余数据后会收到 EOF。
结论:
p3 从 p2 继承的文件描述符中没有写端,因此 p3 拥有的管道写端处于关闭状态
本实验代码实现
- fork系统调用

xargs
此实验涉及到Linux命令xargs的相关知识,建议先去学习一下这个命令的工作原理再做实验,否则寸步难行
实验结果

Lab2『🚀』
Perl脚本文件
主要用于自动生成系统调用存根代码
编写并添加新系统调用的步骤
用户空间
- 在user.h中声明系统调用跳板
- 在usys.pl写明系统调用接口
内核空间
- 写明系统调用号
- 在syscall.c全局声明系统调用,并将其与系统调用号关联
跟踪系统调用的核心逻辑
trace是父进程,exec执行被跟踪的系统调用子进程,子进程通过在fork时复制父进程的跟踪掩码,然后在执行系统调用时通过比对掩码和系统调用号来确定当前系统调用是否被跟踪。

- 作者:axiszql
- 链接:https://axiszql.cn/article/mit6S081_learn
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。


![[MIT-6.S081/Fall2020] 实验笔记零 Lab0: Preparation](https://www.notion.so/image/https%3A%2F%2Fgwzlchn.github.io%2Fimg%2F6.S081%2Fgdb.png?table=block&id=2e52458d-bf0c-8062-9e57-e9fe44971975&t=2e52458d-bf0c-8062-9e57-e9fe44971975)


