【问题标题】:C program to create 3 child processes which read from 3 different files [closed]C程序创建3个从3个不同文件读取的子进程[关闭]
【发布时间】:2013-12-21 14:00:13
【问题描述】:

我有这个问题,如何编写一个 C 程序,该程序创建 3 个子进程,这些子进程从 3 个不同的文件中读取并使用管道写入 父进程。。 p>

每个孩子在书写每 50 个字符之间应等待一段随机时间(3 -10 秒)。

父亲应该阅读 pipes将他获得的所有内容(从所有 3 个文件)写入到一个新文件中。

【问题讨论】:

  • 你尝试了什么?你读过Advanced Linux Programming吗?请出示您的代码。
  • @Bha 使随机单词 bold 不是正确的文本格式。

标签: c linux unix fork pipe


【解决方案1】:

要扩展 Rachit Jain 的答案,您可以使用文件名创建一个数组,并使用循环计数器作为数组的索引,以了解每个子进程应该打开哪个文件。当每个子进程都应该处理相同的文件时效果最好,只需并行执行即可。

至于管道,您确实需要三个不同的管道,每个子进程一个,否则来自子进程的数据可能会混合在一起。使用例如selectpoll 检查来自不同管道的输入。

【讨论】:

  • 谢谢你 joachim 你能用一个例子来扩展它吗?
  • 一个管道就足够了,小于管道缓冲区大小(超过 50 字节,因此所有写入都是安全的)的写入将是原子的。
【解决方案2】:

首先阅读Advanced Linux Programming

您首先需要使用 pipe(2) 系统调用创建 3 个管道(重复 3 次)。

然后您需要使用 fork(2) 系统调用创建 3 个子进程。处理fork的3个可能的返回值:<0失败,==0在孩子,>0在父母。记住父级中的pid_t。在每个子调用中dup2(2)STDOUT_FILENO 成为相关管道的输出。

最后,在父级中,创建一个简单的event loop,使用poll(2) 多路复用系统调用找出哪个管道应该是read(2)

在子级中使用sleep(3)random(3),但不要忘记在PRNG 中添加随机的种子-使用PRNG(例如将getpid(2) 获得的pid 添加到当前@987654332 @....; 或使用/dev/urandomurandom(4))

正如Jonathan Leffler 评论的那样,由于 3*50 小于PIPE_MAX,您可能会使用单个管道。我觉得使用事件循环更安全,更通用(如果将 50 替换为大于 PIPE_MAX 的 500000,它将起作用)。

我想我不想也没有时间为你做更多的功课。我在上面给了你足够的提示。

我认为Federos Koros fedoroskoros@gmail.comtrying to pay someone 做他的作业是非常错误的,我确实给他发了一封私人电子邮件。该问题现已删除。

【讨论】:

  • 一根管子就足够了,而且很安全。并且避免了轮询的需要。
  • 谢谢 basile,它很有帮助
【解决方案3】:

fork () 在一个循环中使用变量 3 次,比如 i,然后在 i=0、i=1 和 i=2 的条件下放置条件。在每种情况下读取您的文件之一。

现在休息也不是什么难事了。

【讨论】:

  • 非常感谢 rachit 你能用一个详细的例子来解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多