Ora non conosco il codice che hai scritto (caso mai postalo e gli do un'occhiata) ma molto probabilmente il problema è dovuto al fatto che non conosci bene la gestione dei processi in Linux. Se provi un codice del genere (codato all'istante, quindi perdonami eventuali errori):
codice:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if ( pid == 0 ) /* processo figlio */
printf("Sono il figlio\n");
printf("Sono il padre\n");
return 0;
}
dovresti avere come output
Sono il figlio
Sono il padre
Sono il padre
o comunque una permutazione di queste tre stringhe (dipende dallo scheduling dei processi), ma comunque il fatto interessante è che la stringa "Sono il padre" viene stampata due volte, questo perché l'istruzione "printf("Sono il padre\n");" viene eseguita sia dal processo figlio che dal processo padre, mentre l'istruzione "printf("Sono il figlio\n");", poiché si trova sotto la condizione pid == 0, viene eseguta solo dal processo figlio, questo perché la fork() ritorna due volte, all'interno del figlio (0) e all'interno del padre (pid del figlio), sempre se non ci sono errori (-1).
Se invece apporti questa modifica:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if ( pid == 0 ) /* processo figlio */
printf("Sono il figlio\n");
else /* processo padre */
printf("Sono il padre\n");
return 0;
}
"Sono il padre" viene stampata solo una volta, questo perché se pid == 0 siamo nel processo figlio e viene eseguita l'istruzione successiva, "altrimenti" (else) siamo nel processo padre e viene eseguita l'istruzione relativa. Nota però che "return 0;" verrebbe eseguita da entrambi i processi, perché non sta né nel corpo di if né in quello di else.
Ancora
codice:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if ( pid == 0 ) {/* processo figlio */
printf("Sono il figlio\n");
exit(0);
}
printf("Sono il padre\n");
return 0;
}
in questo caso ottieni lo stesso output di prima perché il processo figlio, una volta eseguita la printf(), termina con l'istruzione exit(0), qundi non c'è bisogno dell'if-then-else.
Insomma la questione è un po' troppo lunga da spiegare (ci sarebbe ad esempio da esaminare il caso della exec con la quale non ci sarebbe bisogno di nulla di tutto questo...) ma è un argomento intrattabile su un forum, dovresti studiare almeno i fondamenti della gestione dei processi in ambiente Unix. La programmazione multiprocesso all'inizio può spiazzare un po', ma con un po' di studio ci si rende conto che non è affatto difficile (almeno in Unix).
Ah gia... Turing è il primo nome che m è venuto in mente, non so ma m è sembrato carino dargli il nome di uno dei padri dell'informatica, almeno la shell con cui parlo ha anche un nome umano :-P
Ah ok pensavo fosse un riferimento alla macchina di Turing e non capivo il nesso XD