|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
[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è???
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! Ultima modifica di monelli : 16-07-2010 alle 15:10. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
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
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Ops scusa ho appena modificato... i parte da 2... Però non lo capisco lo stesso!
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
quindi la condizione i >= 1 && !fork() è falsa perché fork() > 0 |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Quote:
2 1 ??????
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! Ultima modifica di monelli : 16-07-2010 alle 15:37. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
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 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Riecco il tuo problema.
La risposta corretta è: il programma stampa "1" o non stampa un bel niente. Riscrivi il ciclo con un while: Codice:
#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;
}
Ci sono due possibilità:
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.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 16-07-2010 alle 15:45. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
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!
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
|
Quote:
Grazie
__________________
Dont drink and drive but smoke and fly Peugeot 206 enfant terrible!!! |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Jul 2011
Messaggi: 1
|
Ciao a tutti!
qualcuno potrebbe aiutarmi a risolvere un programma in programm concorrente pe rla scuola? Grazie |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
posta una domanda e qualcuno ti risponderà :v
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12945
|
Quanto è brutta la fork... ogni volta che la vedo mi accorgo di quanto fa cacare il suo comportamento
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:01.




















