Я пытаюсь сделать основную многопроцессорную задачу, и это то, что у меня есть.Прежде всего, я не знаю, как сделать эту программу неблокирующим процессом, потому что, когда я жду ответа дочернего элемента (с waitpid
), другие процессы также должны ждать в очереди., но что произойдет, если некоторые дочерние процессы умирают раньше (я имею в виду, процессы умирают в беспорядке)?Итак, я искал, и мне кажется, что я могу получить PID процесса, который только что умер, для этого я использую waitpid(-1, WNOHANG)
.Я всегда получаю предупреждение, что WNOHANG
- это не число, но когда я добавил библиотеку sys_wait_h, я не получил эту ошибку, но скрипт никогда не ждет PID, что может быть ошибкой?
#!/usr/bin/perl
#use POSIX ":sys_wait_h"; #if I use this library, I dont get the error, but it wont wait for the return of the child
use warnings;
main(@ARGV);
sub main{
my $num = 3;
for(1..$num){
my $pid = fork();
if ($pid) {
print "Im going to wait (Im the parent); my child is: $pid\n";
push(@childs, $pid);
}
elsif ($pid == 0) {
my $slp = 5 * $_;
print "$_ : Im going to execute my code (Im a child) and Im going to wait like $slp seconds\n";
sleep $slp;
print "$_ : I finished my sleep\n";
exit(0);
}
else {
die "couldn’t fork: $!\n";
}
}
foreach (@childs) {
print "Im waiting for: $_\n";
my $ret = waitpid(-1, WNOHANG);
#waitpid($_, 0);
print "Ive just finish waiting for: $_; the return: $ret \n";
}
}
Заранее спасибо, пока!