Рассмотрите использование библиотеки мобильности как бойкий или апачское портативное время выполнения . Они обычно обеспечивают безопасные, портативные альтернативы вызовам как они. Это - хорошая вещь также, потому что эти небезопасные вызовы удерживаются от использования в большинстве современных сред.
Если вам действительно нужно установить тайм-аут для данного системного вызова, проблема более простая, чем асинхронное программирование.
Все, что вам нужно, - это 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;
}
Если ваша внешняя программа не принимает никаких входных данных, поищите следующие слова на странице руководства perlipc
:
Вот безопасный обратный апостроф или канал, открытый для чтения:
Используйте пример кода и защитите его сигналом тревоги (который также объясняется в perlipc
).
Я прочитал все ответы здесь и в других местах, и ответ, похоже, такой ... Не используйте реестр! Неужели это действительно то, что Microsoft хочет, чтобы мы делали с данными конфигурации программы, которые применяются ко всем пользователям!?
Оба они затрудняют передачу возвращенной информации обратно в основную программу.