2026-10-24 周六休息 被ChatGPT气疯
日常
今天上午状态挺好的、ChatGPT差点把我气疯了。
我原本就是demo级别的练习、到后面用健硕代码的规格挑刺儿。
今天还想着规划下周的、真的是有心无力了。
今天已经对POSIX的 open、read、write、lseek 等等 熟悉了。
ChatGPT 今日规划
今天统一采用一个原则:先独立尝试,再根据实际卡点查资料,最后用运行结果验收。 不以代码写得快不快作为唯一标准。一、统一测试规则
每个任务建议限时 30 分钟独立尝试,之后再花 15–25 分钟解决问题。三个任务全部完成后,再根据情况复测。
测试时遵循以下规则:
- 开始前关闭课程笔记,不复制以前写过的代码。
- 可以使用编辑器、编译器和终端;独立阶段不查旧代码、不问 AI、不搜索实现方案。
- 独立阶段结束后,记录当前状态,再决定是否查阅
man手册、课程笔记或其他资料。 - 每次程序运行都要观察实际结果,不能只以“编译成功”作为完成标准。
三个等级如何判定
| 等级 | 判定标准 |
|---|---|
| A:独立完成 | 不查实现资料,独立编写、编译、运行成功;能解释关键系统调用和程序行为。 |
| B:查阅资料后完成 | 独立阶段未完成或存在错误;通过查阅手册、笔记等解决问题,随后能解释并验证修复结果。 |
| C:未能完成 | 查阅资料后仍无法完成核心功能,或程序现象与预期不符且无法解释。 |
这里有个重要区别:查过 man 2 read 的参数不代表你没有独立能力;直接复制现成程序却说不清原理,也不算真正掌握。
二、任务一:文件 I/O
独立编写文件复制程序
建议用时:30 分钟独立尝试 + 15–25 分钟纠错
测试要求
编写一个 C 程序,将源文件内容复制到目标文件。
例如:
./copy source.txt target.txt
程序至少需要做到:
- 使用
open()打开源文件。 - 使用
open()创建或打开目标文件,并设置合适的权限与标志。 - 使用
read()读取内容,使用write()写入目标文件。 - 正确处理文件结束、系统调用失败和文件描述符关闭。
验收标准
基本复制成功
源文件与目标文件内容一致。
空文件测试
源文件为空时,程序正常结束。
较大文件测试
文件内容较多时仍能完整复制。
错误处理
源文件不存在时,程序给出错误信息并正常退出。
解释关键逻辑
能说明 read() 返回 0、返回 -1,以及 write() 未写完全部数据时分别应如何处理。
已验证 0/5 项。这里的勾选仅用于记录测试结果。
重点观察: 你是否考虑了 write() 可能只写入部分字节,而不是默认一次调用就能写完全部内容。这是文件 I/O 中值得特别检查的边界情况。
三、任务二:进程控制
使用 fork() 与 waitpid()
建议用时:30 分钟独立尝试 + 15–25 分钟纠错
测试要求
编写一个程序,使用 fork() 创建子进程,由父进程使用 waitpid() 等待并回收子进程。
要求能够区分父子进程,并观察它们的执行行为。
验收标准
正确创建进程
fork() 成功后,父进程与子进程能够执行各自的分支。
理解返回值
能解释 fork() 在父进程和子进程中分别返回什么。
等待并回收
父进程调用 waitpid(),且能够确认等待结果。
检查退出状态
能获取并解释子进程的退出状态,例如正常退出与异常终止的区别。
解释执行顺序
知道父子进程的输出顺序不一定固定,也知道 waitpid() 能保证什么、不能保证什么。
已验证 0/5 项。
重点观察: 你是否真正理解 fork() 之后执行流分成两条,以及 waitpid() 不只是“等一等”,还承担回收子进程资源的作用。
四、任务三:管道通信
使用 pipe() 实现父子进程通信
建议用时:30 分钟独立尝试 + 15–25 分钟纠错
测试要求
编写一个 C 程序:
- 使用
pipe()创建匿名管道。 - 使用
fork()创建子进程。 - 让一方写入一段消息,另一方读取并打印消息。
- 正确关闭双方不需要的管道端。
今天先做单向通信,不需要扩展成双向通信或多进程通信。
验收标准
消息传递成功
接收方打印的消息与发送方写入的内容一致。
理解管道两端
能够区分 pipefd[0] 的读端与 pipefd[1] 的写端。
正确关闭文件描述符
读方关闭不需要的写端,写方关闭不需要的读端。
程序能够正常结束
不会因为某一端仍然打开而导致读取端一直等待 EOF。
解释通信机制
能说明为什么管道需要在 fork() 前创建,以及父子进程如何继承管道文件描述符。
已验证 0/5 项。
重点观察: 管道通信最容易出现的问题不是 pipe() 调用本身,而是文件描述符的继承和关闭。某个进程仍然持有写端时,读端可能一直等不到 EOF。
五、今天最终要留下什么结果?
三个任务都做完后,不需要写长篇学习总结。每项只记录下面这些内容即可:
| 记录项 | 你需要回答的问题 |
|---|---|
| 最终等级 | A 独立完成、B 查资料后完成,还是 C 未能完成? |
| 实际结果 | 程序是否编译、运行成功?测试了什么? |
| 卡点 | 最先卡在哪里?忘记 API、缺少实现思路,还是对运行机制理解不清? |
| 后续动作 | 是否需要隔一段时间再独立写一次? |
还有一个限制:不要因为某项拿到 B 或 C,就立刻扩展出十个新任务。 先完成三个抽查,再看结果决定下周的重点。
如果三个任务都能独立完成且解释清楚,下一步就不必继续反复练习这些基础例子,可以进入更接近真实项目的综合练习。如果某项需要查资料,也不必推翻之前的学习成果,只针对暴露出来的具体问题复练。
今天的目标不是把 Linux 系统编程全部学完,而是获得三个可靠的能力判断。