识别 IPC 连接的路径


🌐 Identifying paths for IPC connections

net.connect()net.createConnection()server.listen()socket.connect() 采用 path 参数来识别 IPC 端点。

在 Unix 上,本地域也称为 Unix 域。路径是文件系统路径名。当路径名的长度大于 sizeof(sockaddr_un.sun_path) 的长度时,会抛出错误。典型值为 Linux 上 107 字节,macOS 上 103 字节。如果 Node.js API 抽象创建了 Unix 域套接字,它也会解除链接该 Unix 域套接字。例如,net.createServer() 可能会创建一个 Unix 域套接字,而 server.close() 会将其解除链接。但如果用户在这些抽象之外创建 Unix 域套接字,用户需要手动将其删除。当 Node.js API 创建 Unix 域套接字但程序随后崩溃时,同样适用。总之,Unix 域套接字会在文件系统中可见,且会一直存在直到被解除链接。在 Linux 上,你可以通过在路径开头添加 \0 来使用 Unix 抽象套接字,例如 \0abstract。Unix 抽象套接字的路径在文件系统中不可见,并且当所有打开的套接字引用关闭时,它会自动消失。

🌐 On Unix, the local domain is also known as the Unix domain. The path is a file system pathname. It will throw an error when the length of pathname is greater than the length of sizeof(sockaddr_un.sun_path). Typical values are 107 bytes on Linux and 103 bytes on macOS. If a Node.js API abstraction creates the Unix domain socket, it will unlink the Unix domain socket as well. For example, net.createServer() may create a Unix domain socket and server.close() will unlink it. But if a user creates the Unix domain socket outside of these abstractions, the user will need to remove it. The same applies when a Node.js API creates a Unix domain socket but the program then crashes. In short, a Unix domain socket will be visible in the file system and will persist until unlinked. On Linux, You can use Unix abstract socket by adding \0 to the beginning of the path, such as \0abstract. The path to the Unix abstract socket is not visible in the file system and it will disappear automatically when all open references to the socket are closed.

在 Windows 上,本地域使用命名管道来实现。路径必须指向 \?\pipe\\\.\pipe\ 中的一个条目。任何字符都是允许的,但后者可能会对管道名称进行一些处理,例如解析 .. 序列。尽管看起来可能不是这样,管道命名空间是平面的。管道不会持久存在。当最后一个对它的引用关闭时,管道会被移除。与 Unix 域套接字不同,Windows 会在拥有它的进程退出时关闭并移除管道。

🌐 On Windows, the local domain is implemented using a named pipe. The path must refer to an entry in \\?\pipe\ or \\.\pipe\. Any characters are permitted, but the latter may do some processing of pipe names, such as resolving .. sequences. Despite how it might look, the pipe namespace is flat. Pipes will not persist. They are removed when the last reference to them is closed. Unlike Unix domain sockets, Windows will close and remove the pipe when the owning process exits.

JavaScript 字符串转义要求路径使用额外的反斜杠进行转义,例如:

🌐 JavaScript string escaping requires paths to be specified with extra backslash escaping such as:

net.createServer().listen(
  path.join('\\\\?\\pipe', process.cwd(), 'myctl'));