in reply to IPC::Open3 STDOUT does not EOF?

Your child probably filled up the STDERR pipe and blocked trying to add more. You have a race condition.

If you don't need to capture the child's STDERR, this problem can be avoided by sending the child's STDERR to the parent's STDERR or to a file (such as /dev/null).

open3(*HIS_IN, *HIS_OUT, '>&STDERR', ...)
open(local *NULL, '>', '/dev/null') or die; open3(*HIS_IN, *HIS_OUT, '>&NULL', ...)

If you need to capture the child's STDERR, you'd do better to use a higher-level module such as IPC::Run3 or IPC::Run. Otherwise, you'll need to use select or threads or non-blocking IO.