我已經寫了一個腳本,其中包括並行生成gcov。我成功了,但它一次創建了17個子進程。但是我一次只創建6個子進程,第7個子進程應該在1child進程終止。如何限制perl中的子進程?
sub gcov_parallel()
2 {
3 print "Generating Gcov...\n";
4 my $kid;
5 my $pid;
6 @list = (@iucall,@iurcall_init,@iurcall_term,@iurcall_uti,@nob,@nobcch,@nobcell,@nobrrc,@nobcall,@rnccall,@cellin
fo,@rnccom,@cellrrm,@uerrm,@uerrc,@uecall,@iupcded);
7 my $len_list = scalar(@list);
8 my $maxlen =0;
9 my $count = 0;
10 my $process = 0;
11 $total_components = scalar(@comp_list);
12
13 for(my $comp_count=0; $comp_count < $len_list ; ($comp_count=$comp_count+$no_of_machines))
14 {
15 #limiting child process to 6
16 if($process == 6)
17 {
18 $pid = wait();
19 $process=$process-1;
20 }
21 else
22 {
23 $pid = fork();
24 if($pid eq 0)
25 {
26 for(my $files_count = 0; $files_count < $no_of_machines; $files_count++)
27 {
28 $count = $files_count+$comp_count;
29 if($count < $len_list)
30 {
31 chomp($list[$count]);
32 my @list_gcda =`ls $list[$count]/*.gcda | sort`;
&generate_gcov("$list[$count]",@list_gcda);
34 }
35 }
36 wait();
37 exit;
38 }
39 $process=$process+1;
40 }
41 }
42 do
43 {
44 $kid = waitpid(-1, 0);
45 }while $kid > 0;
46 }
But i observed while running the script it is skipping files while generating gcov.
列表1中包含..成分的陣列@ iucall,@ uerrc等......每個組件陣列包含files.for第1 6個部件工作正常,但之後,這是跳過備用組件 – Nethra 2013-05-14 08:48:54
您在第36行中的wait()調用看起來很可疑:第26-35行構成了子進程的代碼,對吧?這些都不必等待任何其他子進程,因爲它沒有子進程。從而阻塞,因此父進程不會收到任何終止信號。我想知道你的劇本是否終止。 – collapsar 2013-05-14 10:02:17