당신은 올바른 접근 방식을 가지고 있습니다. STDOUT 터미널 ("광고 버퍼링") 인 경우 개행 만나면
my @cmd = ('perl', '-e', '$|=1; for (1..5) { print "$_\n"; sleep 1; }');
open(my $pipe, '-|', @cmd)
or die("Can't launch child: $!\n");
while (defined(my $line = <$pipe>)) {
chomp($line);
print "<$line>\n";
}
STDOUT 서면, 대부분의 프로그램들은 출력 플러시. STDOUT이 터미널이 아닌 경우 ("블록 버퍼링") 대부분의 프로그램은 4KiB 또는 8KiB의 청크 출력을 차단합니다. 그래서 위의 예에서 하위 프로그램에
$|=1;
을 사용해야했습니다.
설명대로 작동하는 프로그램은 파이프 대신 의사 터미널을 사용하여 회선 버퍼링을 사용하여 속일 수 있습니다.
my @cmd = ('unbuffer', 'perl', '-e', 'for (1..5) { print "$_\n"; sleep 1; }');
open(my $pipe, '-|', @cmd)
or die("Can't launch child: $!\n");
while (defined(my $line = <$pipe>)) {
chomp($line);
print "<$line>\n";
}
IPC::Run은 가상 터미널을 생성하는 고유 한 방법을 제공합니다.
use IPC::Run qw(run);
my @cmd = ('perl', '-e', 'for (1..5) { print "$_\n"; sleep 1; }');
my $buf = '';
run(\@cmd, '>pty>', sub {
$buf .= $_[0];
while ($buf =~ s/^(.*)\r\n//) {
print "<$1>\n";
}
});
소켓이 백틱과 어떤 관련이 있는지 이해할 수 없습니다. 프로그램의 STDOUT을 읽거나 소켓을 읽으려고합니까? – ikegami
줄 바꿈을 stdout에 추가하자마자 stdout을 비동기 적으로 읽고 출력 할 수 있기를 원합니다. 소켓 부분은 중요하지 않습니다. – TheAschr
1 개 이상의 입력 **에서 비동기 적으로 읽으려면 0 개 이상의 클라이언트에게 이벤트를 보내려면 * 비 차단 IO *로 작업하고 모든 IO를 동시에 지정하기 위해'select' 명령을 사용해야합니다 ... –