Что такое Perl-эквивалент PHP proc_open (), proc_close () и т. Д.? - PullRequest
0 голосов
/ 03 октября 2010

Используя PHP proc_open(), я могу запустить процесс, читать из STDOUT и STDERR (отдельно) произвольное количество байтов за раз, используя fread() во время работы процессаопределите, когда процесс завершен, используя feof() на каналах STDOUT и STDERR, а затем используйте proc_close(), чтобы получить код выхода процесса.Я сделал все это в PHP.Это хорошо работает и дает мне много контроля.

Есть ли способ сделать все эти вещи в Perl?Подводя итог, я должен быть в состоянии сделать следующее:

  • запустить внешний процесс
  • читать STDOUT и STDERR отдельно
  • читать STDOUT и STDERR произвольное количество байтов за раз во время работы процесса (т. е. без ожидания завершения процесса)
  • обнаружение, когда процесс завершен
  • получитькод выхода из процесса

Заранее спасибо за ваши ответы.

Ответы [ 3 ]

3 голосов
/ 03 октября 2010

Вы можете свернуть свое собственное решение, используя интерфейс системных вызовов Perl, но проще использовать встроенный модуль IPC :: Open3. Что касается вашего списка:

Запустить внешний процесс:

use IPC::Open3;
use IO::Handle;
use strict;

my $stdout = IO::Handle->new;
my $stderr = IO::Handle->new;
my $pid = open3(undef, $stdout, $stderr, 'my-command', 'arg1', 'arg2');

Читайте STDOUT и STDERR отдельно, произвольное количество байтов за раз:

my $line = <$stdout>;
# Or
sysread $stderr, my $buffer, 1024;

Определить, когда процесс завершится:

use POSIX qw(sys_wait_h);

waitpid $pid, 0;  # Waits for process to terminate
waitpid $pid, WNOHANG;  # Checks if the process has terminated

Получить код завершения процесса:

my $status = $?;  # After waitpid indicates the process has exited

Обязательно прочитайте документацию по IPC :: Open3; как он предупреждает, легко оказаться в тупике, если у вас есть раздельные каналы stdout и stderr, если вы не будете осторожны. Если дочерний процесс заполняет любой канал, он блокируется, а если родительский процесс читает другой канал, он будет блокировать.

2 голосов
/ 03 октября 2010

Вы хотите этот модуль: IPC :: Open3

1 голос
/ 03 октября 2010

Вы хотите IPC :: Run, он захватывает IO и возвращает значение выхода

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