创建2个子进程以使用管道对文件的单词进行排序

时间:2013-11-09 14:16:01

标签: c unix process fork pipe

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

算法如下

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

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

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

现在我想将单词的排序拆分为2个子进程,但我不明白如何执行此操作。

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

1 个答案:

答案 0 :(得分:2)

如果你不想在这里使用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的stdin,将stdout重命名为输出管道,并执行sort命令)
  • 读取带有排序结果的输出管道,合并并删除父项
  • 中的重复项

示例:sort-parallel-uniq.c