View Full Version : [C] Fork, programmazione concorrente domande
Non sò se posso postare qua o aprire un thread in programmazione...
Cmq mi servirebbe capire se il mio ragionamento è corretto o se sbaglio qualcosa....
Ho questo:
for(i=2 ; i>=1 && !fork() ; i--) printf( "%d\n" , i );
Cosa fà??? !fork() vuol dire fork==0...
Allora...
Sono il padre i=2 creo un figlio A con i=2 non stampo niente i=1
A stampa 2 esegue i-- quindi i=1
Sono il padre i=1 creo un figlio B con i=1 non stampo niente i=0
A i=1 crea un figlio C i=1 non stampa niente i=0 FINE
B stampa 1 esegue i-- quindi i=0 FINE
C stampa 1 esegue i-- quindi i=0 FINE
Quindi in conclusione stampo 2 1 1 giusto??? Ma cisto che sono in concorrenza potre anche stampare 1 2 1 ???
PS l'ho appena eseguito e stampa 2 1 Perchè???
PID Padre 8315
PID Figlio 8316 ------> Padre 8315
2
PID Figlio 8317 ------> Padre 8316
1
In pratica il padre cre un figlio che stampa 2 questo a sua volta crea un figlio che stampa 1... Perchè???
non ho capito perché stampa 2 se i parte da 1.. comunque fork al padre ritorna il pid del figlio, quindi un numero > 0 ed esce dal for.. non può stampare più di una volta se la fork riesce
Ops scusa ho appena modificato... i parte da 2... Però non lo capisco lo stesso!
Sono il padre i=2 creo un figlio A con i=2 non stampo niente i=1
A stampa 2 esegue i-- quindi i=1
Sono il padre i=1 creo un figlio B con i=1 non stampo niente i=0
A i=1 crea un figlio C i=1 non stampa niente i=0 FINE
B stampa 1 esegue i-- quindi i=0 FINE
C stampa 1 esegue i-- quindi i=0 FINEQuando il padre crea il primo figlio la fork gli ritorna il pid del figlio
quindi la condizione
i >= 1 && !fork() è falsa perché fork() > 0
Quando il padre crea il primo figlio la fork gli ritorna il pid del figlio
quindi la condizione
i >= 1 && !fork() è falsa perché fork() > 0
Ok e fin lì ci sono... però il resto??? Facendolo girare stampa:
2
1
??????
Ok e fin lì ci sono... però il resto???
Il padre entra nel for, crea il figlio, la condizione è falsa ed esce dal for senza stampare
Il primo figlio dopo essere creato ha fork() = 0, quindi la condizione del for è vera, stampa 2 e decrementa i
Il primo figlio fa la stessa cosa del proprio parent, quindi non stampa niene ma genera un figlio
Il secondo figlio stampa 1 e decrementa
Ora i è zero e il secondo figlio neanche esegue la fork
DanieleC88
16-07-2010, 15:40
Riecco il tuo problema.
La risposta corretta è: il programma stampa "1" o non stampa un bel niente.
Riscrivi il ciclo con un while:
#include <unistd.h>
#include <stdio.h>
int main()
{
int i = 1;
while ((i >= 1) && (fork() == 0)) {
printf("%d\n", i);
i = (i - 1);
}
return 0;
}
Intanto, come avete già notato, si parte da 1 anziché da 2.
Ci sono due possibilità:
la prima fork() fallisce
la prima fork() non fallisce
Nel primo caso, fork() != 0, per cui la condizione viene falsificata e il ciclo mai eseguito.
Nel secondo caso, fork() != 0 ma il figlio viene creato con i = 1, per cui la condizione viene falsificata nel padre e il ciclo eseguito solo dal figlio che stampa "1". Il figlio poi decrementerà la variabile i e farà fallire sempre il successivo controllo: per questo, il ciclo viene eseguito al più una volta.
ciao ;)
EDIT: ops, ho letto solo ora, se si parte da i = 2 il risultato è ovviamente diverso.
azz scusa avevo sbagliato a scrivere prima... i è inizializzato a 2!!!
Adesso comunque mi guardo il tuo esempio... e se hai tempo mi puoi fare anche una spiegazione con 2??? grazie!
Il padre entra nel for, crea il figlio, la condizione è falsa ed esce dal for senza stampare
Il primo figlio dopo essere creato ha fork() = 0, quindi la condizione del for è vera, stampa 2 e decrementa i
Il primo figlio fa la stessa cosa del proprio parent, quindi non stampa niene ma genera un figlio
Il secondo figlio stampa 1 e decrementa
Ora i è zero e il secondo figlio neanche esegue la fork
Ok è ciò che mi sfuggiva... Sbagliavo il funzionamento del for... Ero convinto che il padre facesse due fork, una per i=2 e una per i=1 invece NO!!!!!
Grazie
DanieleC88
16-07-2010, 15:59
Esattamente, ogni fork() con esito positivo fa fallire la condizione, per cui stampi tutti i numeri da 2 ad 1 (se tu cambiassi l'indice di partenza, sarebbe da n ad 1), o ti fermi alla prima fork() che fallisce. :)
Ciao a tutti!
qualcuno potrebbe aiutarmi a risolvere un programma in programm concorrente pe rla scuola? Grazie
posta una domanda e qualcuno ti risponderà :v
Quanto è brutta la fork... ogni volta che la vedo mi accorgo di quanto fa cacare il suo comportamento :asd:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.