|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Jun 2008
Messaggi: 5
|
[C] Problema fork
Salve a tutti, ho necessità di implementare in C un programma concorrente in ambiente Linux, per la precisione il simulatore di una stazione ferroviaria. Peccato che mi sia fermato già alle prime battute in quanto il seguente codice
Codice:
#include <stdio.h> #include <sys/types.h> #define NUM_TRENI 4 void treno(int i){ printf("Il treno %d vuole entrare in stazione...\n",i); } int main(){ int i; for(i=0;i<NUM_TRENI;i++){ if(fork()==0){ treno(i); } } } Codice:
Il treno 0 vuole entrare in stazione... Il treno 1 vuole entrare in stazione... Il treno 2 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 2 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 1 vuole entrare in stazione... Il treno 2 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 2 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... Il treno 3 vuole entrare in stazione... |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
Il codice che hai scritto è un po' un pasticcio: così com'è in tutti i processi (sia padre che figlio) viene chiamato un fork in ogni passo del ciclo. A occhio io metterei un else in cui esco dal ciclo se il processo è padre, così hai esattamente un numero di fork pari alla lunghezza del ciclo.
Ultima modifica di Cait Sith : 20-08-2011 alle 16:53. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12843
|
Il problema è la fork che è un obbrobbrio e ti fa perdere completamente il flusso del codice.
|
![]() |
![]() |
![]() |
#4 |
Junior Member
Iscritto dal: Aug 2011
Messaggi: 2
|
modifica il codice in questo modo e vedi che funziona
![]() #include <stdio.h> #include <sys/types.h> #include <stdlib.h> //necessaria per la exit() #define NUM_TRENI 4 void treno(int i){ printf("Il treno %d vuole entrare in stazione...\n",i); } int main(){ pid_t figlio; int i; for(i=0;i<NUM_TRENI;i++){ figlio=fork(); if(!figlio){ treno(i); }else exit(1); } return 0; } |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Jun 2008
Messaggi: 5
|
Grazie mille. Adesso funziona perfettamente ma non ho capito una cosa: la differenza sostanziale con la mia versione sta nella exit() nel ramo dell'if relativo al padre. Questa funzione non dovrebbe causare la terminazione del processo padre?
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 309
|
il fork è una operazione delicata e metterla in un ciclo for è pericoloso perchè ogni volta che chiami un fork il processo viene duplicato, se chiamo un fork in un ciclo all'iterazione 0 forki il processo in due, a questo punto avrai due processi che proseguono con l'iterazione 1, all'interazione 1 forki nuovamente, quindi da 2 processi passi a 4, e così via. Poichè a ogni fork hai sempre un padre e un figlio capisci anche tu che la funzione treno viene chiamata molte più volte di NUM_TRENI
se invece fai uscire dal ciclo o metti un exit al processo padre ciò non accade comunque il fork va usato in maniera diversa, separando nettamente il flusso di codice tra padre e figlio dopo la chiamata a quella funzione |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:37.