Proc::Simple lets you instantiate forks that are managed by objects. You can set kill_on_destroy, causing a signal to be sent to the child when the managing object falls out of scope. It's only about 330 lines of code excluding comments and POD, and deals with tricky timing, zombies, and output redirection. So if you are unable to use external modules (that's another topic), you might just study it to determine what it does that you're not doing.
It came in handy for me on a recent project where I didn't want to invest a lot of time into reinventing the functionality that is provided on CPAN already.