PDA

Visualizza la versione completa : [c]Creare processi con la fork


anx721
20-04-2004, 18:17
Salve, ho un problema a far funzionare la fork per creare dei processi. Il mio scopo è avere il processo padre che crea 2 processi figli ognuno dei quali stampa una stringa. Ho scritto questo codice, in cui in un ciclo for il padre esegue la fork creando un figlio ad
ogni iterazione:



#include <unistd.h>
# include <stdio.h>

int main( int argc, char **argv)
{
printf("\nInizio");

int pid = 1;
int testNumber;

for(testNumber = 0; ((testNumber < 2) && (pid != 0)); testNumber++){
pid = fork();
}

//Se sono il figlio pid vale zero e quindi stampo
if(pid == 0){
if(testNumber == 1){
printf("\nuno");
}
if(testNumber == 2){
printf("\ndue");
}
}

return 0;
}


Io mi aspetterei di vedere stampate in qualche ordine le stringhe "Inizio" "uno" "due",

ivece ottengo:

Inizio Inizio Inizio uno due

Come mai? Non riesco a capire questo output. Perche Inizio appare tre volte? :quipy:

gokan
20-04-2004, 20:35
Ciao anx, anche se non ti posso aiutare, volevo approfittare del 3d per chiederti se hai già studiato la realizzazione di thread, semafori etc sotto windows. Hai qualche buon link riguardo queste cose? Finora mi sono basata sull'MSDN di microsoft, spesso non è molto chiara :(

anx721
20-04-2004, 23:28
No, non so nulla dell'argomento che mi chiedi perche nonme ne sono occupato,

:ciauz:

LeleFT
21-04-2004, 11:58
Non capisco perchè non funzioni... purtroppo ora non posso provarlo perchè non dispongo di una distribuzione Linux in questo momento, appena posso, però, lo provo.

Per gokan... prova questo link, per thread e semafori: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html a me è stato utilissimo per il laboratorio di S.O.


Ciao. :ciauz:

gokan
21-04-2004, 14:04
Grazie, cercavo qualcosa di più rivolto alla programmazione sotto windows..in ogni caso è un buon link.
Mi sa devo dare sotto con la guida MSDN.
Ciao

anx721
21-04-2004, 14:10
Ho trovato la spiegazione al problema:

La printf scrive su stdout, che è line-buffered. Ciò vuol dire che i caratteri vengono mantenuti in un buffer interno, fino a quando una riga è completa (il fine riga è il carattere '\n'). Quindi: nel momento in cui si chiama la fork, sia il processo padre che il processo figlio ricevono una copia esatta di tutte le variabili, compreso il buffer di stdout e ciò che si trova dentro.

Visto che mi trovo, come si fa a sincronizzare i processi?
In particolare io vorrei che il processo padre non termini prima dei fili. Ho uilizzato subito dopo la fork l'istruzione

wait(...)

che mette in attesa un processo finche non è terminato uno dei figli, quindi il padre dovrebe attendere la terminazione dell'unico figlio generato nel ciclo for prima di andare avanti generando un altro figlio. Pero quello che accade è che il padre termina comunque prima. Come dovrei fare allora per realizzare quello che voglio?

LeleFT
21-04-2004, 14:13
Devi utilizzare waitpid(0) (se non ricordo male, 0 significa che il padre attende la terminazione di tutti i processi figli).


Ciao. :ciauz:

PunkIvi
21-04-2004, 14:23
Usa i semafori o non sincronizzerai mai i processi con affidabilità.

Loading