Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > убить порожденный процесс кнопкой cancel


Автор: spin2 6.7.2006, 18:25
Есть две кнопки - go и cancel. По кнопке go вызывается внешний скрипт:
Код

if (!defined ($pid = fork())) {    
        die "cannot fork: $!";    
    } elsif ($pid == 0) {    
        exec ($string);    
    } else {
        waitpid($pid, 0);
    }


Нужно сделать так, чтобы по кнопке Cancel тот внешний скрипт бы прерывал свою работу, то есть сделать kill дочернего процесса.
Делаю так:
Код

if (defined $pid) {     
        kill($pid);
    }

Переменная $pid глобальная.

Почему-то кнопка Cancel не отрабатывает. Что нужно исправить? 

Автор: sharq 9.7.2006, 14:31
spin2, пробуй убить дочерний прочесс через вызов системной команды:
Код

`kill -9 $pid`


И проверь у тебя $pid точно есть!

 smile  

Автор: spin2 18.7.2006, 16:21
Да, $pid есть... Стало ясно, что проблема в логике программы. Суть примерно такая: в обработчике Go вызывается внешний скрипт отдельным процессом, этот скрипт записывает результаты в файл. Если все ок, то нужно дождаться окончания этого процесса, а потом считать файл, обработать его и закинуть результат в div'ы.  И тут возникает противоречие: с  одной стороны, родитель должен ждать, пока ребенок закинет результат в файл. А с другой стороны - ему нужно иметь возможность убить ребенка при необходимости по Cancel. Поэтому я в затруднении. Может кто-нибудь что-то посоветовать? 

Автор: Nab 18.7.2006, 16:46
AJAX или два фрейма... это самое простое, но конечно pid прийдется сохранять гдето в сессии или куках
А если все делать правильно..... то нельзя, и не рекомендуется. Это противоречит концепции протокола HTTP.
Нужно попробовать по другому организовать логику работы системы. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)