【问题标题】:Is there any well defined pipes such as stdin, stdout and stderr in a process?进程中是否有任何定义明确的管道,例如标准输入、标准输出和标准错误?
【发布时间】:2012-02-10 07:20:56
【问题描述】:

系统中可以同时打开的 z/OS UNIX 管道的数量限制为 8,730。我写了一个程序来测试是否可以达到这个限制。这个程序我执行了很多次,结果显示第8727个管道的创建会失败。

我猜当 UNIX 程序开始执行时,有 3 个定义良好的管道用于 STDIN、STDOUT、STDERR。但是我找不到任何提到“默认管道”的文档,所以我想知道我的猜测是否正确?

【问题讨论】:

  • 澄清一下——你说的是流还是管道? stdin/out/err 是文件 I/O 流;在 UNIX 中,管道是一种特殊类型的文件(如下 Jim McNamara 所述)。
  • @zarchasmpgmr:我只谈管道。
  • 再次澄清:你说的是管道还是文件描述符?每个管道使用两个文件描述符,并且通常对文件描述符具有每个进程的限制。鉴于 stdin、stdout 和 stderr 将消耗 3 个可用的 fd,也许这就是您所说的。

标签: unix operating-system pipe zos


【解决方案1】:

如果这是一个系统范围的限制,那么其他一些东西,一些其他进程,有开放的管道。

管道是指fifos,它是一种特殊类型的文件,流(stdin、stdout、stderr)在开始时不是管道,但它们可以重定向到管道。查看您的 man dup() 页面,以及 mkfifo()。

【讨论】:

  • 谢谢。你的答案很清楚。但是现在我遇到了以下错误信息的内存问题:pipe: EDC5132I Not enough memory. (errno2=0x05970131) Failed when 8726th pipe was created. Errno: 132
  • 正如 Jim 所说,某个 UNIX 进程正在/正在运行,它正在消耗三个管道。我敢打赌,系统进程是这里的罪魁祸首。
【解决方案2】:

你的猜测是正确的。他们被称为standard streams

在 Unix 和类 Unix 操作系统(在某种程度上,Windows)以及某些编程语言接口中,标准流预先连接计算机程序和计算机程序之间的输入和输出通道它开始执行时的环境(通常是文本终端)。这三个 I/O 连接称为标准输入 (stdin)、标准输出 (stdout) 和标准错误 (stderr)。

【讨论】:

  • 感谢您的回复。我知道程序开始执行时有默认文件描述符:stdin、stdout、stderr。但我不确定这三个 I/O 连接是管道。
  • 它们一开始不是管道,但可以切换。
  • @zarchasmpgmr:是的。标准流不是从管道开始的。目前,问题与内存有关。 zOS 上的 BUF_SIZE 为 256(x512Byte)。因此,测试程序可能会消耗超过 1G 的内存(8730x256x512/1024/1024 = 1092.25MB)。
  • 我在Linux上测试了同样的程序,结果还可以。看来zOS UNIX上的BUF_SIZE太大了,相比之下Linux上的BUF_SIZE是8,比zOS UNIX上的256小很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多