4

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

算法如下

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

2)子进程排序器从管道中读取并使用带有 execlp 函数的排序对单词进行排序

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

现在我想将单词的排序拆分为 2 个子进程,但我不明白如何做到这一点。

感谢您提前提供任何输入或帮助。

4

1 回答 1

2

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

以下是相应的 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

于 2013-11-10T13:04:19.503 回答