la chiamata unix execve() esegue un programma esterno (il cui percorso è specificato al momento della chiamata). Se usi unix è sufficiente che chiami execve e come argomento metti una stringa col percorso dell'eseguibile da avviare... al momento della chiamata il programma terminerà e al suo posto verrà eseguito il nuovo programma.
Se invece vuoi che il main non si chiuda, ma rimanga in esecuzione anche dopo che l'altro programma è stato avviato allora devi usare prima una fork() per creare un nuovo processo e la solita execve()...
In win non conosco di preciso le chiamate ma penso ce ne siano di molto simili