目录 前置知识 文件描述符 文件描述符的重定向 shell 对文件描述符的重定向 c函数对文件描述符的重定向 dup dup2 Node中通信原理 unix domain socket 是什么 如何实现 流程图 Server 端 Client 端
目录
- 前置知识
- 文件描述符
- 文件描述符的重定向
- shell 对文件描述符的重定向
- c函数对文件描述符的重定向
- dup
- dup2
- Node中通信原理
- unix domain socket
- 是什么
- 如何实现
- 流程图
- Server 端
- Client 端
- 命名管道(Named Pipe)
- 是什么
- 怎么实现
- 流程图
- Pipe Server
- Pipe Client
- Node 创建子进程的流程
- Unix
- 创建子进程
- 创建管道
- child_process.fork 的详细调用
- 句柄传递
前置知识
文件描述符
在 Linux 系统中,一切都看成文件,当进程打开现有文件时,会返回一个文件描述符。 文件描述符是操作系统为了管理已经被进程打开的文件所创建的索引,用来指向被打开的文件。 当我们的进程启动之后,操作系统会给每一个进程分配一个 PCB 控制块,PCB 中会有一个文件描述符表,存放当前进程所有的文件描述符,即当前进程打开的所有文件。
进程中的文件描述符是如何和系统文件对应起来的? 在内核中,系统会维护另外两种表:
- 打开文件表(Open file table)
- i-node 表(i-node table)
文件描述符就是数组的下标,从0开始往上递增,0/1/2 默认是我们的输入/输出/错误流的文件描述符 在 PCB 中维护的文件描述表中,可以根据文件描述符找到对应了文件指针,找到对应的打开文件表 打开文件表中维护了:文件偏移量(读写文件的时候会更新);对于文件的状态标识;指向 i-node 表的指针 想要真正的操作文件,还得靠 i-node 表,能够获取到真实文件的相关信息
他们之间的关系:
图解
- 在进程 A 中,文件描述符1/20均指向了同一打开文件表项23,这可能是对同一文件多次调用了 open 函数形成的
- 进程 A/B 的文件描述符2都指向同一文件,这可能是调用了 fork 创建子进程,A/B 是父子关系进程
- 进程 A 的文件描述符0和进程 B 的文件描述符指向了不同的打开文件表项,但这些表项指向了同一个文件,这可能是 A/B 进程分别对同一文件发起了 open 调用
总结
- 同一进程的不同文件描述符可以指向同一个文件
- 不同进程可以拥有相同的文件描述符
- 不同进程的同一文件描述符可以指向不同的文件
- 不同进程的不同文件描述符可以指向同一个文件
文件描述符的重定向
每次读写进程的时候,都是从文件描述符下手,找到对应的打开文件表项,再找到对应的 i-node 表