How come exec() doesn't return?

Because that's what it does: it replaces your currently running program with a different one. If you want to keep going (as is nearly always the case) use system instead.