2015-02-07 38 views
0

我将如何实现目录的宽度优先遍历(深度未知且不一定对称)。宽度优先c

我的第一个想法是使用fork。我不知道如何实现它。我正在考虑一个循环,首先得到父母,然后得到这些父母的孩子的数量,然后基于该孩子有多少孩子和孩子,这样多次分岔,由于多进程被制造,所有孩子都是然后chdir'd。然后把孩子当作父母归还。

我觉得这里有可能出现漏洞,我正在寻找可能存在的缺陷,或者这是一种可怕的方法。我听说过人们首先用广度使用叉子,但从来没有找到任何例子,所以如果你有任何我会很乐意看着他们。

回答

1

你的代码如下:

  1. 设置初始化todo队列的基本目录。
  2. 虽然todo队列不为空,
    1. 队列的头分配给path
    2. 删除队列的头部。
    3. 如果path引用一个目录,
      1. 追加文件的路径pathtodo队列。
    4. 使用path执行您想要执行的任何操作。

我不明白为什么你认为fork会有所帮助。


例如,实际Perl实现:

sub dir_contents { 
    my ($path) = @_; 

    my $dh; 
    if (!opendir(my $dh, $path)) { 
     warn("Can't open dir \"$path\": $!\n"); 
     return; 
    } 

    return map { "$path/$_" } grep { !/^\.\.?/ } readdir($dh) 
} 

my @todo = 'some path'; 
while (my $path = shift(@todo)) { 
    if (!stat($path)) { 
     warn("Can't stat \"$path\": $!\n"); 
     next; 
    } 

    push @todo, dir_contents($path) if -d _; 

    print("$path\n"); 
} 
+0

我得到它的最好不要使用这个fork()的(我听说过的人用它做的话),但它会在c中看到这个更有帮助,也许使用sys/queue.h。 – AfterParty 2015-02-10 08:53:54

+0

当然,你可以使用'fork'添加并行性,但是它不会是宽度优先的。如果它让你感觉更好,我可以删除Perl代码。至于你使用sys/queue.h的问题,你知道该怎么问。 StackOverflow不是一个代码写入服务。 – ikegami 2015-02-10 11:47:42