我想创建两个子进程并分配文件中的单词排序.例如,第一个单词转到child1,然后第二个单词转到child2,然后第三个单词转到child1,依此类推.这两个子进程应并行运行,并使用UNIX sort命令对单词进行排序并将输出存储到文件中.
算法如下
1)子进程Parser从文件中获取所有单词并写入管道
2)子进程Sorter从管道中读取并使用带有execlp函数的sort对单词进行排序
3)子进程Supressor使用uniq命令删除重复项.
现在我想将单词的排序拆分为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代码中,您不需要使用命名管道,您可以使用普通管道.并实现拆分而不是生成外部命令:
>创建4个管道和2个子进程
>在父进程中读取输入文件,通过相应的管道以循环方式将行(单词)发送到子进程
>对输入进行排序并将其写入两个子进程中的输出管道(只需将输入管道重定向到sort的stdin,将stdout重定向到输出管道,并执行exec sort命令)
>读取带有排序结果的输出管道,合并并删除父项中的重复项