【发布时间】:2012-10-22 08:44:54
【问题描述】:
好的,所以我是一项关于管道的任务。目标是从命令行获取“深度”“文件名”和“属性”。该文件是一个保存用户信息的txt文件,属性只是我们稍后要排序的信息。然而,深度很重要,因为我需要根据用户输入的数字使用分叉创建二叉树。深度为 1 时,我将拥有我的主进程、一个内部节点和 2 个叶节点。深度为二时,我将拥有我的主进程,一个内部节点有两个内部节点作为子节点,并且它们每个都有两个叶节点作为子节点......等等。
我的代码当前将所有信息读入结构数组,创建正确数量的节点的二叉树,并且我的所有排序算法(Shell、Quick、Bubble)都可以工作。
现在,我必须实现命名管道并将数据向下传递到叶节点进行排序。每个内部节点都应该将数据拆分为其子节点。然后,一旦数据到达叶节点,它们将实施不同的排序算法并将结果返回给它们的父/内部。内部节点将从它的两个子节点中获取排序后的数据并合并结果。最终,数据将一路合并回到锚节点。
我的问题是我根本无法将注意力集中在管道上。我不知道如何跟踪它们或在正确的时间初始化它们。我想过找出给定的深度应该产生多少叶节点并以这种方式平均分割数据,然后只做一个 if 语句来对数据的每个部分运行正确的排序器,但这并不能解决正确的问题问题。任何人都可以帮助我实现这一点,或者至少从什么开始?
树的创建是这样的
void forkTree(int size){
if(size == 0){
return;
}
int left = fork();
if(left != 0){
int right = fork();
if(right == 0){
sleep(1);
forkTree(size-1);
}
}
else{
sleep(1);
forkTree(size-1);
}
它是这样调用的
if(depth>0){
//initial fork
int anchor = fork();
//make binary tree only in child process
if(anchor==0){
forkTree(depth);
}
【问题讨论】:
-
命名管道就像文件。使用 mkfifo 创建一个,您可以使用 read(2) 和 write(2) 调用来写入它们。具体有什么不明白的?他们的创造或使用?
-
@WoodrowDouglass 好吧,起初我没有意识到在递归地制作这些管道时,它们可以在不同的过程中具有相同的名称。我只是无法跟踪谁在接收和发送什么。
-
你需要使用命名管道吗?似乎没有更简单?
-
如果您不需要使用命名管道,请使用 pipe() 系统调用创建未命名管道。这样做更好,因为它不会用命名管道阻塞文件系统。如果您仍然需要它,您可以根据 getpid() 生成名称,因为您的每个子进程都有自己的 PID。无论如何,如果需要命名管道,请告诉我们!
标签: c sorting fork pipe named-pipes