1. Why does my child never return (i.e. "Child ended." is never printed, even if the launched executable ended)?
The manual page for execve (for which execl is a front-end) states:
execve() does not return on success, and the text, data, bss, and stack of the calling process are overwritten by that of the program loaded.[...]
That means that the program containing "printf("Child ended.\n") is replaced by the program denoted by "executableName". Hence anything written behind execve and companions is invoked if and only if execve has failed.