PDA

View Full Version : [C] Fork, programmazione concorrente domande


monelli
16-07-2010, 14:36
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è???

tuccio`
16-07-2010, 15:06
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

monelli
16-07-2010, 15:10
Ops scusa ho appena modificato... i parte da 2... Però non lo capisco lo stesso!

tuccio`
16-07-2010, 15:22
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

monelli
16-07-2010, 15:33
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

??????

tuccio`
16-07-2010, 15:37
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.

monelli
16-07-2010, 15:44
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!

monelli
16-07-2010, 15:52
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. :)

Jin2011
04-07-2011, 22:30
Ciao a tutti!

qualcuno potrebbe aiutarmi a risolvere un programma in programm concorrente pe rla scuola? Grazie

tuccio`
05-07-2011, 00:12
posta una domanda e qualcuno ti risponderà :v

WarDuck
05-07-2011, 20:33
Quanto è brutta la fork... ogni volta che la vedo mi accorgo di quanto fa cacare il suo comportamento :asd: