Perl: когда вы делаете 'open (A, "proc |") "make" close (A) "немедленно возвращаются - PullRequest
2 голосов
/ 11 сентября 2011

Если я делаю «open (A,« proc | »)», как мне заставить «close (A)» возвращаться мгновенно, даже если «proc» еще не завершил запись в стандартный вывод?

"man perlfunc" говорит мне:

Преждевременное закрытие конца чтения канала (т. е. до того, как процесс, выполняющий запись в него на другом конце, закроет его), приведет к доставке SIGPIPE писателю,Если другой конец не может справиться с этим, обязательно прочитайте все данные перед закрытием канала.

но есть ли обходной путь?Конкретный пример:

$|=1; 
open(A,"curl -sN http://test.barrycarter.info/bc-slow-cgi.pl|"); 

while (<A>) { 
  print "THUNK: $_\n"; 
  if (/5$/) {last;} 
} 

print "LOOP EXIT\n"; 
close(A); 
print "A CLOSED\n"; 

bc-slow-cgi.pl просто печатает time () один раз в секунду навсегда: приведенный выше код печатает «LOOP EXIT», но никогда «A CLOSED».

1 Ответ

5 голосов
/ 11 сентября 2011

close на дескрипторе, созданном open -|, ожидает завершения дочернего процесса.Мне кажется, что ребенок должен умереть от сигнала PIPE или ошибки в следующий раз, когда он попытается написать после того, как вы позвоните close, но вы можете убить ребенка, если не хотите ждать так долго.

my $pid = open(...);

while (...) {
   ...
}

kill PIPE => $pid;
close(...);

PIPE немного неортодоксально, но здесь это показалось уместным.Не стесняйтесь отправить TERM или что-то еще.

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