2014-08-27 3 views
1

Следующий вывод будет:убить дочерний процесс, созданный с вилкой

Start of script 
PID=29688 
Start of script 
PID=0 
Running child process 1 
Done with child process 
PID=29689 
Start of script 
PID=0 
Running child process 1 
Done with child process 

Это работает, как задумано, но я хотел бы, чтобы убить предыдущего ребенка PID.

Как можно убить ПИД ребенка без отключения MAIN?

Спасибо!

my $bla = 1; 

while (1) { 

print "Start of script\n"; 
run_sleep(); 

} 

sub run_sleep { 

    sleep(3); 
    my $pid = fork; 

    return if $pid;  # in the parent process 
    print("PID=" . $pid . "\n"); 
    print "Running child process " . $bla++ . "\n"; 
    exit(0); # end child process 

} 
+0

Попытка избежать этого процесса ... из ps-ef [Fork.pl] user2953575

+0

Я не совсем понимаю, почему вы убиваете детей. Не могли бы вы объяснить немного дальше? –

+0

Думаю, если я не убью их, я их накапливаю (зомби). Когда я делаю «ps -ef», я вижу много «несуществующего» процесса – user2953575

ответ

2

Когда вы раскошелиться ребенка, а потом не ждать() на него, он будет отработавший процесс (зомби в Unix жаргоне), когда он выходит. Вы заметите, что его родительский идентификатор процесса становится 1, и он не исчезнет до перезагрузки ОС.

Таким образом, традиционная псевдокод разветвлением выглядит примерно так:

if ($pid = fork()) { 
    # pid is non-zero, this is the parent 
    waitpid($pid) # tell OS that we care about the child 

    do other parental stuff 
} 
else { 
    # pid is 0 so this is the child process 
    do_childish_things() 
} 

Ваш код не делает этого, так что вы, вероятно, получить зомби, а затем разочарованы, что вы не можете избавиться от их.

Смежные вопросы