docs: 全面审查并修正所有章节文档内容

- 修正各章节中的错别字和术语错误(如 IPv4 大写规范、接收/接受区分等)
- 补充和完善部分习题答案
- 优化技术描述的准确性和专业性
- 合并所有章节内容到根 README.md

新增文件:
- CLAUDE.md: 项目开发指南
- .claude/agents/content-reviewer.md: 内容审查 subagent
- .claude/agents/merger.md: 文档合并 subagent

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
riba2534
2026-01-05 15:28:29 +08:00
parent f163bca3a9
commit d44ecdf807
23 changed files with 1933 additions and 825 deletions

View File

@@ -113,7 +113,6 @@ int main(int argc, char *argv[])
}
return 0;
}
```
编译运行:
@@ -130,7 +129,7 @@ Parent proc output: Who are you?
Child proc output: Thank you for your message
```
运行结果是正确的但是如果注释掉第18行的代码,就会出现问题,导致一直等待下去。因为数据进入管道后变成了无主数据。也就是通过 read 函数先读取数据的进程将得到数据,即使该进程将数据传到了管道。因为,注释第18行会产生问题。第19行自己成将读回自己在第 17 行向管道发送的数据。结果父进程调用 read 函数后,无限期等待数据进入管道。
运行结果是正确的,但是如果注释掉代码中子进程里的 `sleep(2);`第18行,就会出现问题,导致一直等待下去。因为数据进入管道后变成了无主数据。也就是通过 read 函数先读取数据的进程将得到数据,即使该进程将数据传到了管道。因为,注释`sleep(2);` 会产生问题。子进程可能读回自己向管道发送的数据。结果父进程调用 read 函数后,无限期等待数据进入管道。
当一个管道不满足需求时,就需要创建两个管道,各自负责不同的数据流动,过程如下图所示:
@@ -198,7 +197,7 @@ gcc echo_storeserv.c -o serv
![](https://s2.ax1x.com/2019/01/22/kFUAHS.png)
从图上可以看出,服务端已经生成了文件,把客户端的消息保存下来只保存了10次消息。
从图上可以看出,服务端已经生成了文件,把客户端的消息保存下来只保存了10次消息。
### 11.3 习题
@@ -206,11 +205,11 @@ gcc echo_storeserv.c -o serv
1. **什么是进程间通信?分别从概念和内存的角度进行说明。**
答:进程间通信意味着两个不同的进程间可以交换数据。从内存来说,就是两个进程可以访问同一个内存区域,然后通过这个内存区域数据的变化来进行通信
答:进程间通信Inter-Process CommunicationIPC是指两个不同的进程间可以交换数据的机制。从概念上讲它允许独立运行的进程之间传递信息、同步操作。从内存角度来说,由于每个进程都有自己独立的内存地址空间,进程间无法直接访问彼此的内存,因此需要操作系统提供特殊的共享内存区域或通信机制(如管道、共享内存、消息队列等),通过这个内核提供的缓冲区来进行数据交换
2. **进程间通信需要特殊的 IPC 机制,这是由于操作系统提供的。进程间通信时为何需要操作系统的帮助?**
答:为了进行进程间通信需要管道的帮助,但是管道不是进程的资源,它属于操作系统,所以,两个进程通过操作系统提供的内存空间进行通信
答:进程间通信需要操作系统的帮助是因为每个进程都有独立的内存地址空间进程之间无法直接访问对方的内存。IPC 机制(如管道)属于操作系统内核管理的资源,而非单个进程的资源。通过 fork 函数复制的是文件描述符,而非管道本身。因此,两个进程必须通过操作系统提供的内核缓冲区来实现数据交换
3. **「管道」是典型的 IPC 技法。关于管道,请回答以下问题:**
@@ -224,4 +223,4 @@ gcc echo_storeserv.c -o serv
3. **管道允许 2 个进程间的双向通信。双向通信中需要注意哪些内容?**
答:向管道传输数据时,先的进程会把数据取走。言之,就是数据进入管道会变成无主数据,所以有时候为了防止错误,需要多个管道来进程通信
答:向管道传输数据时,先调用 read 函数的进程会把数据取走。言之,数据进入管道会变成无主数据,任何连接到该管道的进程都可以读取。因此,在使用单个管道进行双向通信时,一个进程可能会读取到自己写入的数据,导致另一个进程无限等待。为了避免这个问题,通常需要创建两个管道,各自负责不同方向的数据流动