fork() and exec() work well as separate system calls
for the common situation where the child (but not the
parent) needs to adjust something before executing
the new program. Changing file descriptors to implement
> and < in the shell, for example. It's common to see
sequences like
pid = fork();
if(pid == 0){
close(1);
dup(pipefds[1]);
exec(...);
}