Я написал сценарий, который включает в себя генерацию 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.
List1 содержит .. массив компонентов @ iucall, @ uerrc и т.д ... Каждый массив содержит компонент files.For 1-й 6 компонент работает нормально, но после того, что он пропуская альтернативные компоненты – Nethra
ваш вызов 'wait()' в строке 36 кажется сомнительным: строки 26-35 составляют код для дочерних процессов, правильно? ни один из них не должен ждать каких-либо других дочерних процессов, просто потому, что у него нет дочерних процессов. таким образом, он блокируется, и, следовательно, родительский процесс не получит никакого сигнала завершения. я задаюсь вопросом, завершается ли ваш скрипт вообще. – collapsar