Go crypto/ssh 包,stdoutpipe() 的缓冲区限制是多少 io.Reader

Go crypto/ssh package, what is the buffer limit for stdoutpipe() io.Reader

我正在编写一个实用程序,使用 crypto/ssh 包在远程服务器上执行命令。我目前正在从 session.stdoutpipe() io.Reader 读取到 bytes.Buffer ,我可以在会话完成后格式化并打印出来。

文档指出:

StdoutPipe func() (io.Reader, error) StdoutPipe returns a pipe that will be connected to the remote command's standard output when the command starts. There is a fixed amount of buffering that is shared between stdout and stderr streams. If the StdoutPipe reader is not serviced fast enough it may eventually cause the remote command to block.

到目前为止,我的测试没有遇到任何问题,但我很想知道固定金额是多少。在命令完成之前,我没有读取管道 Reader 就成功地流式传输了高达 6.5mb 的文本。

有谁知道固定数量是多少,或者命令什么时候开始阻塞?我在源码里找不到。

它不在 Go 源代码中,因为它是 OS 依赖的。

应用程序不应依赖于特定的容量:应用程序的设计应确保读取进程在数据可用时立即使用数据,这样写入进程就不会一直处于阻塞状态。

例如,在 Linux 上:

$ man pipe

PIPE(2)                    Linux Programmer's Manual                   PIPE(2)

NAME
       pipe, pipe2 - create pipe

Pipe capacity

       A pipe has a limited capacity.  If the pipe is full, then a write(2)
       will block or fail, depending on whether the O_NONBLOCK flag is set
       (see below).  Different implementations have different limits for the
       pipe capacity.  Applications should not rely on a particular
       capacity: an application should be designed so that a reading process
       consumes data as soon as it is available, so that a writing process
       does not remain blocked.

       In Linux versions before 2.6.11, the capacity of a pipe was the same
       as the system page size (e.g., 4096 bytes on i386).  Since Linux
       2.6.11, the pipe capacity is 16 pages (i.e., 65,536 bytes in a system
       with a page size of 4096 bytes).  Since Linux 2.6.35, the default
       pipe capacity is 16 pages, but the capacity can be queried and set
       using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations.  See
       fcntl(2) for more information.