【问题标题】:Create pipe from one file to another in C在C中创建从一个文件到另一个文件的管道
【发布时间】:2021-11-23 02:36:38
【问题描述】:

在我的学校,我们必须用 C 来编写这个作业:

PART2:编写三个程序 A、B、C。

A 将使用 fork()exec() 系统调用启动 B 和 C。

在启动时,它将重定向 B 和 C 的输出和输入 到管道。

B 将从它的标准输入接收数字并增加它 乘以 5,在其标准输出上打印结果。

C 将从其标准输入中接收一个数字并将其除以 2, 在其标准输出上打印结果。

A 的作用是将这个计算用一个随机数播种到 B, 然后从 B 检索结果,将其发送给 C,从 C 获取结果,将其发送给 B,等等,直到重复 100 次。

如果 A 在将数据发送到另一个进程之间等待 1 秒,那就太好了。

A 将在它自己的标准输出上打印所有从 进程到其他,例如:

001. A -> B 10 B -> A 15 A -> C 15 C -> A 7 002. A -> B 7 B -> A 12...

我已经有了文件 B 和 C。但是我不知道如何对控制一切的文件 A 进行编程。谁能帮帮我?

【问题讨论】:

  • Why is "Can someone help me?" not an actual question?。请提出比“帮助我”更具体的问题。例如是fork 你有问题吗?是管道吗?是exec吗?还有什么?请尽可能多地展示代码,并就您遇到的一个步骤提出具体问题。

标签: c linux unix pipe


【解决方案1】:

每个进程都有一个文件描述符表,当你 fork() 时,子进程会从父进程继承该表的副本。 因此,如果您在进程 A 中有一个管道,那么当您分叉时 - 子进程也将在其表中包含管道的文件描述符。 另一个要求是 B 和 C 将通过标准输入接收, 这是FD 0。 您可以使用 dup2 函数在标准输入的 FD 和管道的 FD 之间进行覆盖。 这样 FD 0 现在将被定向到管道,当您分叉到进程 B 时,它的标准输入现在将来自管道。您可以对标准输出 FD (1) 执行相同操作。 我建议使用 dup() 保留原始标准 I/O FD 的副本,以便在完成分叉后将它们恢复到进程 A。

【讨论】:

  • 有什么方法可以给我看一下代码示例吗?因为我仍然无法理解这个概念。
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2011-01-18
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多