文档地址 https://github.com/ElemeFE/node-interview/blob/master/sections/process.md#process
饿了么文档: Child Process 子进程 (Child Process) 是进程中一个重要的概念. 你可以通过 Node.js 的 child_process 模块来执行可执行文件, 调用命令行命令, 比如其他语言的程序等. 也可以通过该模块来将 .js 代码以子进程的方式启动. 比较有名的网易的分布式架构 pomelo 就是基于该模块 (而不是 cluster) 来实现多进程分布式架构的. child_process.fork 与 POSIX 的 fork 有什么区别? Node.js 的 child_process.fork() 不像 POSIX fork(2) 系统调用, 不会拷贝当前父进程. 这里对于其他语言转过的同学可能比较误导, 可以作为一个比较偏的面试题. … Cluster Cluster 是常见的 Node.js 利用多核的办法. 它是基于 child_process.fork() 实现的, 所以 cluster 产生的进程之间是通过 IPC 来通信的, 并且它也没有拷贝父进程的空间而是通过加入 cluster.isMaster 这个标识, 来区分父进程以及子进程, 达到类似 POSIX 的 fork 的效果. … 如果了解 Node.js 的 IPC 的话, 可以问个比较有意思的问题 在 IPC 通道建立之前, 父进程与子进程是怎么通信的? 如果没有通信, 那 IPC 是怎么建立的? 这个问题也挺简单, 只是个思路的问题. 在通过 child_process 建立子进程的时候, 是可以指定子进程的 env (环境变量) 的. 所以 Node.js 在启动子进程的时候, 主进程先建立 IPC 频道, 然后将 IPC 频道的 fd (文件描述符 ) 通过环境变量 (NODE_CHANNEL_FD) 的方式传递给子进程, 然后子进程通过 fd 连上 IPC 与父进程建立连接.
我的问题是,据我所知,unix的文件描述符表是进程相关的,每个进程都有一份, 如果Nodejs创建子进程不是使用 POSIX 的方式,那子进程也不会复制父进程的文件描述符表和上下文,那么通过NODE_CHANNEL_FD传递一个数字给子进程,子进程该怎么建立连接????
我的想法是 可能一: child_process.fork() 是调用了 POSIX 的fork的,那就说的通了,文件描述符表示一样的,拿到的FD指向文件表项也就相同了 可能二: NODE_CHANNEL_FD传递的不是常规的FD(数字),因为据我所知,IPC无论是靠命名管道(Window),还是unix domain socket(UNIX) S,都使用了文件系统里的一个文件路径,那如果这个 NODE_CHANNEL_FD里存的是个路径,那也说的通了,但是感觉这个可能性很小