IPC::Run3 does everything you want, I've used it often. There's also
IPC::Run, it's more advanced and handles things like timeouts too, but the test reports and the bug count seem to show it doesn't work perfectly everywhere. Lastly, there's
Capture::Tiny, which you can wrap around your
system call.
(There's lots more similar modules, but these three have always seemed "best" to me - most features, best platform support.)