Allora la questione è diversa.
Tu nel tuo primo post hai parlato di avviare "diversi programmi" da un programma iniziale senza che questo stia ad attendere la terminazione di quelli che ha lanciato. Dato che "diversi programmi" è da interpretare come "eseguibili esterni" al tuo programma, ti ho proposto l'accoppiata fork + exec per creare un nuovo processo (fork) e fargli eseguire un programma/eseguibile esterno (exec).
Da quello che dici non mi è chiaro se hanoi.c produce un eseguibile a sé stante (con un suo main) oppure se produce solo codice oggetto che in fase di linking colleghi nel tuo main.c. Nel caso sia un programma eseguibile a sé stante con i suoi parametri da riga di comando, allora l'approccio fork+exec è sensato, altrimenti hai fondamentalmente due strade: creare tanti processi tramite fork() che chiamino la funzione che ti serve con i giusti parametri oppure creare tanti thread (POSIX threads, ovvero pthread) all'interno dello stesso processo che chiamino la funzione.
Il pezzo di codice che hai riportato è sbagliato: dopo la fork, hai due processi che stanno eseguendo lo stesso codice, ovvero il padre ed il figlio. L'unico modo che hai per distinguerli è l'intero ritornato proprio dalla fork:
- Codice: Seleziona tutto
pid_t pid = fork();
if (pid == 0) {
/* codice per il processo figlio, che probabilmente chiamerà hanoi con qualche parametro */
}
if (pid > 0 ) {
/* codice per il processo padre, che probabilmente continuerà a creare processi fino ad un certo limite. Se sei all'interno di un for, te la cavi con un "continue;" */
}
if (pid == -1 ) {
/* ERRORE: la fork non è riuscita. Controlla errno per il tipo di errore. */
}
Dovresti comunque valutare se usare processi o thread multipli per eseguire quello che hai in mente. La creazione di un nuovo processo tramite una fork è un'operazione piuttosto costosa (il sistema deve copiare l'immagine del processo in esecuzione nel nuovo processo figlio), mentre la creazione di un thread all'interno di un processo è molto più leggera, anche se bisogna fare molta più attenzione agli accessi in contemporanea a risorse/variabili condivise/globali.
Dato che bollono in pentola diverse conoscenze dei sistemi UNIX-like (processi, thread ed amenità varie ed eventuali), ti consiglio di documentarti bene prima di proseguire per questa strada
