我努力學習fork
這是一個簡單的程序:退出子進程,安全
#!/usr/bin/perl
# PRGNAME.pl by Whom
#
#
use strict;
use warnings;
main(@ARGV);
sub main
{
my @array = qw(1 2 3 4 5 6);
while ((my $t = pop @array)) {
if (! (my $pid = fork)) {
exit if ($t == 2);
for(;;){}
}
}
waitpid(-1, 0);
message("This is the $PRGNAME exercise file.");
}
sub message
{
my $m = shift or return;
print("$m\n");
}
sub error
{
my $e = shift || 'unkown error';
print("$0: $e\n");
exit 0;
}
但是在外殼上時,我想:ps -fu $LOGNAME | grep [f]ork
,我發現:
i59tib 28361 1 3 16:20:07 pts/34 6:07 /usr/bin/perl ./fork.pl
i59tib 28363 1 3 16:20:07 pts/34 6:07 /usr/bin/perl ./fork.pl
i59tib 28366 1 3 16:20:07 pts/34 6:07 /usr/bin/perl ./fork.pl
i59tib 28364 1 3 16:20:07 pts/34 6:07 /usr/bin/perl ./fork.pl
i59tib 28362 1 3 16:20:07 pts/34 6:08 /usr/bin/perl ./fork.pl
在這裏,人們當我評論此行exit if ($t == 2);
並再次運行ps -fu $LOGNAME | grep [f]ork
我發現:
i59tib 624 623 1 16:29:11 pts/34 0:04 /usr/bin/perl ./fork.pl
i59tib 629 623 1 16:29:11 pts/34 0:04 /usr/bin/perl ./fork.pl
i59tib 628 623 1 16:29:11 pts/34 0:04 /usr/bin/perl ./fork.pl
i59tib 625 623 1 16:29:11 pts/34 0:04 /usr/bin/perl ./fork.pl
i59tib 627 623 1 16:29:11 pts/34 0:04 /usr/bin/perl ./fork.pl
i59tib 626 623 1 16:29:11 pts/34 0:04 /usr/bin/perl ./fork.pl
i59tib 623 4766 0 16:29:11 pts/34 0:00 /usr/bin/perl ./fork.pl
如何退出子進程而不退出父進程?
不,由於'waitpid(-1,0);父母等待所有進程;'我知道這一點,因爲我測試了它。如果您對'exit'進行了評論,那麼父母不會退出,直到孩子完成。 –
請仔細看看第二個'ps' –
如果你不相信我,那麼你發佈的測試證明是相反的,而[documentation](http://linux.die.net/man/2/waitpid),那麼你爲什麼打擾問? – ikegami