【问题标题】:Create 2 child processes to sort words of a file using pipe创建 2 个子进程以使用管道对文件的单词进行排序
【发布时间】:2013-11-09 14:16:01
【问题描述】:

我想创建两个子进程并分配文件中的单词排序。例如,第 1 个单词转到 child1,然后第 2 个单词转到 child2,然后第 3 个单词再次转到 child1,依此类推。这两个子进程应该并行运行,并使用 UNIX sort 命令对单词进行排序并将输出存储到文件中。

算法如下

1) 子进程解析器从文件中获取所有单词并写入管道

2) 子进程 Sorter 从管道中读取数据并使用 sort 和 execlp 函数对单词进行排序

3) 子进程抑制器使用 uniq 命令删除重复项。

现在我想将单词的排序拆分为 2 个子进程,但我不明白该怎么做。

提前感谢您的任何意见或帮助。

【问题讨论】:

  • 您想使用 2 个 CPU 运行 sort -u input_file 命令吗?
  • 我注意到 GNU sort 具有 --parallel 选项,即您可以运行 sort --parallel=2 -u input_file 它对同时运行 2 种排序的输入文件进行排序,删除输出中的重复项。
  • 否 @J.F.Sebastian 我不想在排序中使用任何选项。我将不得不使用编程来做到这一点。有什么想法吗?

标签: c unix process fork pipe


【解决方案1】:

如果您不想在这里使用sort --parallel=2 -u input_file 并且需要使用管道作为练习,那么您可以在此处使用并行merge-sort。将输入文件一分为二。使用您喜欢的任何方法对每一半进行排序。合并已排序的一半以删除重复项。

以下是相应的 bash 命令作为说明:

mkfifo sorted_part1 sorted_part2
sort <(split -un r/1/2 input_file) >sorted_part1 & # sort 1st half
sort <(split -un r/2/2 input_file) >sorted_part2 & # sort 2nd half
sort -um sorted_part1 sorted_part2                 # merge, remove duplicates

在您的 C 代码中,您不需要使用命名管道,您可以使用普通管道。并实现split 而不是生成外部命令:

  • 创建 4 个管道和 2 个子进程
  • 在父进程中读取输入文件,通过相应的管道以循环方式向子进程发送行(单词)
  • 对输入进行排序并将其写入两个子进程中的输出管道(只需将输入管道重定向到排序的标准输入,排序的标准输出到输出管道,然后执行sort 命令)
  • 读取带有排序结果的输出管道,合并并删除父管道中的重复项

例如:sort-parallel-uniq.c

【讨论】:

  • @user2575021:我更新了the code,以确保在任何子子进程失败时程序退出并出错,并通过为子进程启用writes 的缓冲来提高时间性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 2021-03-05
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多