当前位置: 首页 > 面试题库 >

Linux管道作为输入和输出

平俊茂
2023-03-14
问题内容

我想在Linux操作系统上的C程序内执行以下操作:

  • 使用syscall(或2)创建PIPE
  • 使用exec()执行新流程
  • 将流程的STDIN连接到先前创建的管道。
  • 将流程的输出连接到另一个PIPE。

这样做的目的是为了性能目的而避免访问任何驱动器。

我知道使用PIPE系统调用创建管道非常简单,我可以使用popen为输入或输出目的创建管道。

但是您将如何针对输入和输出执行此操作?


问题答案:

您需要对管道非常小心:

  1. 调用pipe()两次,一次用于子级管道,一次用于子级管道,产生4个文件描述符。
  2. 调用fork()。
  3. 在儿童中:
    • 在标准输入(文件描述符0)上调用close()。
    • 调用dup()-或dup2()-以将管道到子级的读取结束作为标准输入。
    • 在管道到子项的读取端调用close()。
    • 在管道到子项的写入端调用close()。
    • 在标准输出(文件描述符1)上调用close()。
    • 调用dup()-或dup2()-将子管道的写入结束写入标准输出
    • 在pipe-from-child的写入端调用close()。
    • 在从子管道读取的末端调用close()。
    • 执行所需的程序。
  4. 在父母中:
    • 在读取子管道结束时调用close。
    • 在子管道发送的写入端调用关闭。
    • 循环在pipe-to-child的写端上将数据发送到child并在pipe-from-child的读端上从child读取数据
    • 当不再发送给子代时,关闭管道到子代的写入结束。
    • 收到所有数据后,关闭子管道的读取结束。

注意关闭的数量,尤其是在孩子中。如果使用dup2(),则不必显式关闭标准输入和输出。但是,如果您执行显式关闭,则dup()可以正常工作。还要注意,dup()和dup2()都不会关闭重复的文件描述符。如果忽略关闭管道,则两个程序都无法正确检测到EOF;当前进程仍可以写入管道的事实意味着管道上没有EOF,并且程序将无限期挂起。

请注意,此解决方案不会更改孩子的标准错误;它与父级的标准错误位于同一位置。通常,这是正确的。如果您有一个特殊的要求,即以不同的方式处理来自子级的错误消息,那么也应对子级的标准错误采取适当的措施。



 类似资料:
  • 问题内容: 本质上,我正在尝试替换: 为了避免使用硬盘驱动器,请在C ++中使用管道。这是我的代码: 我绝对可以确保上述字符串已正确初始化。但是,发生了两件事对我来说没有意义: (1)我正在执行的程序报告“输入文件为空”。由于我未使用“ <”调用程序,因此不应期望输入文件。相反,它应该期待键盘输入。此外,它应该阅读“ gulp_command”中包含的文本。 (2)程序的报告(通过标准输出提供)出

  • 问题内容: 有没有人有创建Java中的管道对象,任何好的建议 是 从Java既是一个InputStream和和OutputStream没有多重继承和两个流是抽象类,而不是接口? 基本需求是有一个可以传递给需要InputStream或OutputStream的对象的对象,该对象需要将一个线程的输出传递给另一个线程的输入。 问题答案: 看来这个问题的重点已被遗漏。如果我对您的理解正确,那么您希望一个对

  • 问题内容: 我正在尝试使用PhantomJS将html页面呈现为pdf。我不想将文件写入磁盘,内存中有html,并且内存中需要pdf。 使用从Pooria阿芝米的出色答卷,在这个问题,我能够从命名管道获取PDF。当另一端尝试相同时(用命名管道替换输入文件),我最终得到一个空白的pdf。 这就是我现在正在做的(简体): 然后在另一个终端: 文件out.pdf已创建,但为空白。我想念什么吗? 问题答案

  • 前面两节里我们用到的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是$h$和$w$(像素),那么它可以表示为一个$3\times h\times w$的多维数组。我们将大小为3的这一维称为通道(channel)维。本节我们将介绍含多个输入通道或多个输出通道的卷积核。 多输入通道 当输入数据含多个通道时

  • null (它也应该与ffprobe和ffplay一起工作)

  • 问题内容: 在Linux 3.0 / C ++下: 我想要一个执行以下操作的函数: 显然上述方法不起作用,但是您可以理解。我有一个字符串s,我希望将其作为应用程序“ foo”的子进程执行的标准输入传递,然后将其标准输出记录到字符串r中,然后将其返回。 我应该使用linux syscall或posix函数的什么组合? 问题答案: eerpini提供的代码无法正常工作。请注意,例如,之后将使用在父级中