I'm curious if the long line is split between getline() calls. If it was you could check if the returned line was newline terminated. If it wasn't terminated then call getline() again and concatenate the data yourself. (I know this is UGLY.)
Yeah, I was curious about that as well, but haven't tried re-reading it because I think that'd be a bug in getline() and should be fixed there. getline() should always read until a newline (or EOF), and neither seems to be the case (unless the kernel erroneously sends EOF for some reason).
The problem is that I can't reproduce it in a standalone script, it only happens randomly on a busy production server, so my options in debugging this are limited.
You might also see if flushing the write side makes any difference. I wouldn't expect it to help but it may be worth a try.
That one I've tried, using printflush() instead of print on the IO::Handle of the writer makes no difference.
And yes, it's as simple as described, a single writer and a single reader.