mirror of
https://github.com/riba2534/TCP-IP-NetworkNote.git
synced 2026-05-07 05:51:47 +08:00
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:
@@ -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
|
||||
|
||||

|
||||
|
||||
从图上可以看出,服务端已经生成了文件,把客户端的消息保存可下来,只保存了10次消息。
|
||||
从图上可以看出,服务端已经生成了文件,把客户端的消息保存了下来,只保存了10次消息。
|
||||
|
||||
### 11.3 习题
|
||||
|
||||
@@ -206,11 +205,11 @@ gcc echo_storeserv.c -o serv
|
||||
|
||||
1. **什么是进程间通信?分别从概念和内存的角度进行说明。**
|
||||
|
||||
答:进程间通信意味着两个不同的进程间可以交换数据。从内存上来说,就是两个进程可以访问同一个内存区域,然后通过这个内存区域数据的变化来进行通信。
|
||||
答:进程间通信(Inter-Process Communication,IPC)是指两个不同的进程间可以交换数据的机制。从概念上讲,它允许独立运行的进程之间传递信息、同步操作。从内存角度来说,由于每个进程都有自己独立的内存地址空间,进程间无法直接访问彼此的内存,因此需要操作系统提供特殊的共享内存区域或通信机制(如管道、共享内存、消息队列等),通过这个内核提供的缓冲区来进行数据交换。
|
||||
|
||||
2. **进程间通信需要特殊的 IPC 机制,这是由于操作系统提供的。进程间通信时为何需要操作系统的帮助?**
|
||||
|
||||
答:为了进行进程间通信,需要管道的帮助,但是管道不是进程的资源,它属于从操作系统,所以,两个进程通过操作系统提供的内存空间进行通信。
|
||||
答:进程间通信需要操作系统的帮助是因为:每个进程都有独立的内存地址空间,进程之间无法直接访问对方的内存。IPC 机制(如管道)属于操作系统内核管理的资源,而非单个进程的资源。通过 fork 函数复制的是文件描述符,而非管道本身。因此,两个进程必须通过操作系统提供的内核缓冲区来实现数据交换。
|
||||
|
||||
3. **「管道」是典型的 IPC 技法。关于管道,请回答以下问题:**
|
||||
|
||||
@@ -224,4 +223,4 @@ gcc echo_storeserv.c -o serv
|
||||
|
||||
3. **管道允许 2 个进程间的双向通信。双向通信中需要注意哪些内容?**
|
||||
|
||||
答:向管道传输数据时,先读的进程会把数据取走。简言之,就是数据进入管道候会变成无主数据,所以有时候为了防止错误,需要多个管道来进程通信。
|
||||
答:向管道传输数据时,先调用 read 函数的进程会把数据取走。换言之,数据进入管道后会变成无主数据,任何连接到该管道的进程都可以读取。因此,在使用单个管道进行双向通信时,一个进程可能会读取到自己写入的数据,导致另一个进程无限等待。为了避免这个问题,通常需要创建两个管道,各自负责不同方向的数据流动。
|
||||
|
||||
Reference in New Issue
Block a user