my $rv = sysread(FIFO, $fifodata, 64*1024, length($fifodata)); #### my $rv = sysread(FIFO, $fifodata, 64*1024, length($fifodata)); if (!defined($rv)) { ... handle error ... } if (!$rv) { ... handle eof. There might be a partial message in $fifodata ... } while (...$fifodata contains a complete message...) { ...extract message from $fifodata... ...process message... } #### while (length($fifodata) > $MSG_SIZE) { my $msg = substr($fifodata, 0, $MSG_SIZE, ''); process_msg($msg); } #### while ($fifodata =~ s/^([^\n]*\n)//) { my $msg = $1; process_msg($msg); }