Как я могу выполнить системную команду в Perl асинхронно?

Рассмотрите использование библиотеки мобильности как бойкий или апачское портативное время выполнения . Они обычно обеспечивают безопасные, портативные альтернативы вызовам как они. Это - хорошая вещь также, потому что эти небезопасные вызовы удерживаются от использования в большинстве современных сред.

10
задан brian d foy 18 November 2009 в 00:35
поделиться

3 ответа

Если вам действительно нужно установить тайм-аут для данного системного вызова, проблема более простая, чем асинхронное программирование.

Все, что вам нужно, - это alarm () внутри блока eval ().

Вот пример блока кода, который помещает их в подпрограмму, которую вы можете добавить в свой код. В примере вызывается спящий режим, поэтому вывод не интересен, но он показывает интересующие вас функции тайм-аута. Результат работы:

/ bin / sleep 2 failure: timeout at ./time-out строка 15.

$ cat time-out
#!/usr/bin/perl

use warnings;
use strict;
my $timeout = 1;
my @cmd = qw(/bin/sleep 2);
my $response = timeout_command($timeout, @cmd);
print "$response\n" if (defined $response);

sub timeout_command {
        my $timeout = (shift);
        my @command = @_;
        undef $@;
        my $return  = eval {
                local($SIG{ALRM}) = sub {die "timeout";};
                alarm($timeout);
                my $response;
                open(CMD, '-|', @command) || die "couldn't run @command: $!\n";
                while(<CMD>) {
                        $response .= $_;
                }
                close(CMD) || die "Couldn't close execution of @command: $!\n";
                $response;
        };
        alarm(0);
        if ($@) {
                warn "@cmd failure: $@\n";
        }
        return $return;
}
8
ответ дан 3 December 2019 в 18:33
поделиться

Если ваша внешняя программа не принимает никаких входных данных, поищите следующие слова на странице руководства perlipc :

Вот безопасный обратный апостроф или канал, открытый для чтения:

Используйте пример кода и защитите его сигналом тревоги (который также объясняется в perlipc ).

1
ответ дан 3 December 2019 в 18:33
поделиться

Я прочитал все ответы здесь и в других местах, и ответ, похоже, такой ... Не используйте реестр! Неужели это действительно то, что Microsoft хочет, чтобы мы делали с данными конфигурации программы, которые применяются ко всем пользователям!?

Оба они затрудняют передачу возвращенной информации обратно в основную программу.
  • В системах, которые его поддерживают, вы можете установить сигнал тревоги (perldoc -f alarm), а затем очистить его в обработчике сигналов.
  • Вы можете использовать цикл событий, такой как POE или Coro.
  • Вместо обратных кавычек вы можете использовать open () или соответственно open2 или open3 (см. IPC :: Open2, IPC :: Open3) для запуска программы при получении ее STDOUT / STDERR через дескриптор файла. Запустите на нем неблокирующие операции чтения. (perldoc -f select и, возможно, google "perl неблокирующее чтение")
  • В качестве более мощного варианта openX () посмотрите IPC :: Run / IPC :: Cmd.
  • Наверное, я могу ' Я не думаю об этом посреди ночи.
  • 12
    ответ дан 3 December 2019 в 18:33
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: