Есть две проблемы. Во-первых, дочерний процесс буферизует свой вывод; и во-вторых, родительский процесс использует оператор <>
, который блокируется до тех пор, пока не будет доступна полная строка, или до конца файла.
Итак, один из способов получить ожидаемый результат - заставить дочерний процесс закрыть свой поток вывода сразу после записи:
if ($pid == 0) {
print "$$";
close STDOUT;
sleep 5;
exit;
}
Другой способ - добавить новую строку в вывод дочернего процесса, а затем очистить поток:
if ($pid == 0) {
print "$$\n";
STDOUT->flush; # "close STDOUT;" will work too, of course
sleep 5;
exit;
}
Сброс необходим, потому что каналы (как правило) не буферизуются, а не буферизуются по линии, как потоки, подключенные к терминалу.
Третий вариант - установить для потока вывода дочернего процесса значение autoflush:
if ($pid == 0) {
$| = 1;
print "$$\n";
sleep 5;
exit;
}