This is really weird…
I removed the sleep commands and printed the $pos in the start message.
Both processes tell the same startposition. Nevertheless I also get non-15 lines of output every now and then. 1536 loops were okay, then the parent didn't read any lines.
My modified 123099.pl code:
#!/usr/bin/perl
use IO::Handle;
use strict;
use warnings;
my $pos= tell *DATA;
my $pid= fork();
die unless defined $pid;
if ($pid == 0) {
my $x= IO::Handle->new();
$x->fdopen(fileno(DATA), "r");
seek $x, $pos, 0;
print "Start c $pos\n";
while (<$x>) {
print "c: $_";
}
print "stop c\n";
}
else {
my $y= IO::Handle->new();
$y->fdopen(fileno(DATA), "r");
seek $y, $pos, 0;
print "Start p $pos\n";
while (<$y>) {
print "p: $_";
}
print "waiting for child\n";
wait;
print "stop p\n";
}
__DATA__
a
b
c
d
e
And my modified version of your test-bash:
#!/bin/bash
i=1
while : ; do
o=$( ./1230099.pl )
n=$( echo "$o" | wc -l )
(( n == 15 )) || break
printf '%d\r' $((i++))
done
echo "$i:$n"
echo "$o"
Update I've run it several times now and this is the result:
2182: 10
1504: 10
560: 10
14: 10
919: 10
360: 10
908: 10
200: 10
65: 10
108: 10
43: 10
105: 10
296: 10
345: 10
100: 10
1084: 10
1278: 10
224: 10
6: 10
8: 10
125: 10
684: 10
96: 10
8: 10
579: 10
So after an unpredictable amount of iterations (6 to 2182) the scripts prints 10 instead of 15 lines…
s$$([},&%#}/&/]+}%&{})*;#$&&s&&$^X.($'^"%]=\&(|?*{%
+.+=%;.#_}\&"^"-+%*).}%:##%}={~=~:.")&e&&s""`$''`"e
|