44
55### 1. 实验目标 🎯
66
7- 通过编写一个支持作业控制的Unix Shell程序 ,深入理解进程控制和信号处理的核心概念。
7+ 通过编写一个支持作业控制的 Unix Shell 程序 ,深入理解进程控制和信号处理的核心概念。
88
99### 2. 实验概述 📝
1010
11- Shell是一个交互式命令行解释器 ,负责接收用户指令并执行相应程序。本实验要求实现一个简化版的Shell ,包含基本的命令解析、进程创建、信号处理、作业控制和I/O重定向功能。实验提供了骨架代码和完整的命令解析器,你需要实现核心执行逻辑和控制机制。
11+ Shell 是一个交互式命令行解释器 ,负责接收用户指令并执行相应程序。本实验要求实现一个简化版的 Shell ,包含基本的命令解析、进程创建、信号处理、作业控制和I/O重定向功能。实验提供了骨架代码和完整的命令解析器,你需要实现核心执行逻辑和控制机制。
1212
13- 关于Shell原理和实现方法的详细指导 ,请参阅[ 实验指导文档] ( docs/guide.md ) 。
13+ 关于 Shell 原理和实现方法的详细指导 ,请参阅[ 实验指导文档] ( docs/guide.md ) 。
1414
1515### 3. 实验要求 📋
1616
1717#### 3.1 基本功能(必做)
1818
19- - 命令提示符为` "tsh> " `
19+ - 命令提示符为 ` "tsh> " `
2020- 执行命令行程序(前台或后台运行)
21- - 实现作业控制(bg、fg等 )
21+ - 实现作业控制(bg、fg 等 )
2222- 处理键盘信号(Ctrl+C、Ctrl+Z)
23- - 实现基本的I/O重定向 (` < ` 、` > ` )
23+ - 实现基本的 I/O 重定向 (` < ` 、` > ` )
2424- 回收终止的子进程
2525
2626#### 3.2 内建命令
2727
28- - ` quit ` /` exit ` :终止shell
28+ - ` quit ` /` exit ` :终止 shell
2929- ` jobs ` :列出所有后台作业
3030- ` bg <job> ` :将一个停止状态的后台作业转为运行状态
3131- ` fg <job> ` :将一个后台作业转为前台运行
3232- ` cd <dir> ` :切换当前工作目录
3333
3434#### 3.3 输出格式规范 📋
3535
36- 为了确保自动化测试的正确性,你的Shell必须严格遵循以下输出格式 :
36+ 为了确保自动化测试的正确性,你的 Shell 必须严格遵循以下输出格式 :
3737
3838##### 作业状态消息
3939
@@ -56,10 +56,10 @@ Shell是一个交互式命令行解释器,负责接收用户指令并执行相
5656
5757##### ` bg ` /` fg ` 命令输出
5858
59- - ` bg ` 命令输出:` [%d] (%d) %s & `
59+ - ` bg ` 命令输出:` [%d] (%d) %s & `
6060 - 例如:` [1] (12345) /bin/ls -l & `
6161
62- - ` fg ` 命令输出:不需要特殊输出,只显示命令本身
62+ - ` fg ` 命令输出:不需要特殊输出,只显示命令本身
6363
6464##### 错误消息
6565
@@ -75,7 +75,7 @@ Shell是一个交互式命令行解释器,负责接收用户指令并执行相
7575- 进程不存在:` (%d): No such process `
7676 - 例如:` (12345): No such process `
7777
78- - 作业ID不存在 :` %%%d: No such job `
78+ - 作业 ID 不存在 :` %%%d: No such job `
7979 - 例如:` %1: No such job `
8080
8181### 3.4 附加任务(选做)🌟
@@ -128,16 +128,23 @@ Shell是一个交互式命令行解释器,负责接收用户指令并执行相
128128├── include
129129│ └── shell.h # 头文件,包含函数声明与数据结构
130130├── Makefile # 用于编译项目
131- └── src
132- ├── builtins.c # 内置命令的实现
133- ├── jobs.c # 作业控制相关函数
134- ├── main.c # 主函数
135- ├── parser.c # 命令解析相关函数
136- ├── shell.c # Shell 核心逻辑
137- ├── signals.c # 信号处理函数
138- └── utils.c # 工具函数
131+ ├── src
132+ │ ├── builtins.c # 内置命令的实现
133+ │ ├── jobs.c # 作业控制相关函数
134+ │ ├── main.c # 主函数
135+ │ ├── parser.c # 命令解析相关函数
136+ │ ├── shell.c # Shell 核心逻辑
137+ │ ├── signals.c # 信号处理函数
138+ │ └── utils.c # 工具函数
139+ ├── tests # 测试用例目录
140+ │ └── cases # 包含多个测试点
141+ └── tshref # 参考实现
139142```
140143
144+ > [ !NOTE]
145+ >
146+ > 提供的代码框架更像是一个起步代码(starter code),如果你觉得现有框架限制了你的实现方式,可以根据需要直接修改代码结构,只要最终实现满足功能要求且能通过测试即可。
147+
141148命令解析器提供了以下结构:
142149
143150``` c
@@ -214,7 +221,7 @@ python grader.py -d 5-jobs
214221 - 命令执行与进程管理
215222 - 信号处理
216223 - 作业控制
217- - I/O重定向
224+ - I/O 重定向
218225 - 代码风格与注释
219226
220227- 选做任务(20%)
@@ -239,6 +246,35 @@ python grader.py -d 5-jobs
239246
240247参与评优无需额外申请,所有按时提交的作业都将自动纳入评选范围。我们期待看到你富有创意且高质量的 Shell 实现,展现你对操作系统概念的深刻理解和实际应用能力。
241248
249+ #### 6.2 学术诚信 🔍
250+
251+ 我们高度重视学术诚信,它是计算机科学教育的基石。我们期望你能够独立完成实验,真正掌握系统编程的核心概念和技能。
252+
253+ - ** 鼓励的行为** ✅
254+ - 与同学讨论实验的概念性问题和整体设计思路
255+ - 在课堂或实验课上请教助教关于实验中遇到的困难
256+ - 查阅官方文档、教科书和其他公开学习资源
257+
258+ - ** 禁止的行为** ❌
259+ - 抄袭或共享代码(包括但不限于同学之间、网络资源等)
260+ - 试图绕过或破解测试系统
261+ - 让他人代为完成作业
262+
263+ > [ !WARNING]
264+ >
265+ > 我们使用代码相似度检测工具对所有提交的代码进行检查。一旦发现抄袭或其他学术不端行为,将严格按照学校相关规定处理。
266+
267+ #### 6.3 关于 AI 工具使用 🤖
268+
269+ 在现代编程环境中,ChatGPT、Claude、DeepSeek 等大型语言模型以及基于它们的工具(如 GitHub Copilot、Cursor 等)已成为许多开发者的辅助工具。我们认可这些工具在学习过程中的价值,同时也希望你合理使用它们:
270+
271+ 1 . ** 理解优先** :AI 工具可以帮助解释概念、提供思路或优化代码片段,但不应替代你对底层原理的理解。使用这些工具前,请先尝试自己分析问题。
272+ 2 . ** 学习而非依赖** :将 AI 工具视为学习助手而非解决方案提供者。如果使用 AI 生成代码,确保你完全理解每一行代码的作用及其背后的原理。同时,使用 AI 工具直接生成完整的实验解决方案并提交为自己的工作是不允许的。这不仅违背了学术诚信原则,也会阻碍你获得通过实验设计的学习体验。
273+ 3 . ** 批判性思考** :AI 生成的内容可能存在错误或不适合特定场景。建议始终以批判性思维评估其建议,并根据你对操作系统概念的理解进行调整。
274+ 5 . ** 在报告中声明** :如果你在实验过程中使用了 AI 工具获取重要帮助,建议在实验报告中简要说明使用方式和范围。
275+
276+ 合理使用AI工具可以增强学习效果,但最终的理解和代码实现应反映你自己的努力和思考。操作系统是计算机科学的核心领域,亲自实现这些机制将为你的技术成长奠定坚实基础。
277+
242278### 7. 提交方式 📤
243279
244280使用 GitHub Classroom 进行提交。请你确保所有代码已提交到你的对应仓库,GitHub Actions 会自动运行测试,其输出作为我们的评分依据。
0 commit comments