[C] Cosa fa questa funzione?
Ciao ragazzi, non riesco a capire cosa faccia questa funzione:
Ho provato a effettuare la chiamata k(4) e mi stampa i numeri da 0 a 15, ma non riesco a darmene una spiegazione...
Grazie in anticipo
int k(int l) { int i, n=0; for(i=0; i<l; i++) { n*=2; if(fork()) n+=1; } return n; }
Ho provato a effettuare la chiamata k(4) e mi stampa i numeri da 0 a 15, ma non riesco a darmene una spiegazione...
Grazie in anticipo
Risposte
Hai idea di cosa faccia la funzione fork?
"apatriarca":
Hai idea di cosa faccia la funzione fork?
Si, il funzionamento della fork la conosco
Ho provato a effettuare la chiamata k(4) e mi stampa i numeri da 0 a 15
...ma k(4) ritorna un intero. Sarebbe meglio se riporti tutto il codice!
"grausof":Ho provato a effettuare la chiamata k(4) e mi stampa i numeri da 0 a 15
...ma k(4) ritorna un intero. Sarebbe meglio se riporti tutto il codice!
int k(int l) { int i, n=0; for(i=0; i<l; i++) { n*=2; if(fork()) n+=1; } return n; } int main() { printf("%i\n", k(4)); }
Intendevo anche il codice di "fork()"!
"grausof":
Intendevo anche il codice di "fork()"!
La fork() è un'istruzione già implementata nel linguaggio di programmazione!
("Una fork in programmazione è la modalità attraverso cui un processo crea in memoria una copia di se stesso: la copia prenderà il nome di processo figlio, mentre il processo originale verrà chiamato processo padre. Più in generale, una fork in un ambiente multithreading significa che un thread di esecuzione è stato duplicato.") [Wikipedia]
@grausof: Credo intenda dire che ha stampato il valore di ritorno e che i 16 processi generati durante l'esecuzione di quella funzione restituiscono tutti i numeri da 0 a 15.
Puoi ragionare nel seguente modo:
1. Il processo originale P0 chiama fork quattro volte, ogni volta con un valore corrente di \(n\) differente. Il primo figlio P1 avrà un valore di \(n\) uguale a \(0\), il secondo P2 uguale a \(2\), il terzo P3 uguale a \(6\), il quarto P4 uguale a \(14\). Restituisce a questo punto \(15\).
2. Il processo P1 chiamerà fork tre volte, generando P5, P6 e P7. I valori di \(n\) in questo caso saranno uguali a \(0\), \(2\) e \(6\) e restituirà \(7\).
3. Il processo P2 chiamerà fork due volte, generando P8 e P9. I valori di \(n\) saranno rispettivamente uguali a \(4\) e \(10\). Il valore restituito sarà quindi \(11\).
4. Il processo P3 chiamerà fork una sola volta, generando P10 con \(n\) uguale a \(12\), e restituirà \(13\).
5. Il processo P4 restituisce \(14\) senza generare altri processi.
6. Il processo P5 genera i processi P11 e P12 con \(n\) rispettivamente uguale a \(0\) e \(2\). Restituisce \(3\).
5. Il processo P6 genera il processo P13, con \(n\) uguale a \(4\), e restituisce \(5\).
6. Il processo P7 restituisce \(6\).
7. Il processo P8 genera P14 con \(n\) uguale a \(8\) e restituisce \(9\).
8. Il processo P9 restituisce \(10\).
9. Il processo P10 restituisce \(12\).
10. Il processo P11 genera P15 con \(n\) uguale a \(0\) e restituisce \(1\).
11. I processi P12, P13, P14 e P15 restituiscono rispettivamente \(2\), \(4\), \(8\) e \(0\).
Ti lascio il compito di costruirti una qualche regola generale per il funzionamento. Ma spero che ora sia più chiaro che cosa succede.
EDIT: La definizione in Wikipedia fa abbastanza schifo, ma la fork è comunque una funzione fornita dal sistema operativo. Genera un processo che è la copia di quello corrente e restituisce un valore non nullo se si è nel processo padre e nullo se si è nel processo figlio.
Puoi ragionare nel seguente modo:
1. Il processo originale P0 chiama fork quattro volte, ogni volta con un valore corrente di \(n\) differente. Il primo figlio P1 avrà un valore di \(n\) uguale a \(0\), il secondo P2 uguale a \(2\), il terzo P3 uguale a \(6\), il quarto P4 uguale a \(14\). Restituisce a questo punto \(15\).
2. Il processo P1 chiamerà fork tre volte, generando P5, P6 e P7. I valori di \(n\) in questo caso saranno uguali a \(0\), \(2\) e \(6\) e restituirà \(7\).
3. Il processo P2 chiamerà fork due volte, generando P8 e P9. I valori di \(n\) saranno rispettivamente uguali a \(4\) e \(10\). Il valore restituito sarà quindi \(11\).
4. Il processo P3 chiamerà fork una sola volta, generando P10 con \(n\) uguale a \(12\), e restituirà \(13\).
5. Il processo P4 restituisce \(14\) senza generare altri processi.
6. Il processo P5 genera i processi P11 e P12 con \(n\) rispettivamente uguale a \(0\) e \(2\). Restituisce \(3\).
5. Il processo P6 genera il processo P13, con \(n\) uguale a \(4\), e restituisce \(5\).
6. Il processo P7 restituisce \(6\).
7. Il processo P8 genera P14 con \(n\) uguale a \(8\) e restituisce \(9\).
8. Il processo P9 restituisce \(10\).
9. Il processo P10 restituisce \(12\).
10. Il processo P11 genera P15 con \(n\) uguale a \(0\) e restituisce \(1\).
11. I processi P12, P13, P14 e P15 restituiscono rispettivamente \(2\), \(4\), \(8\) e \(0\).
Ti lascio il compito di costruirti una qualche regola generale per il funzionamento. Ma spero che ora sia più chiaro che cosa succede.
EDIT: La definizione in Wikipedia fa abbastanza schifo, ma la fork è comunque una funzione fornita dal sistema operativo. Genera un processo che è la copia di quello corrente e restituisce un valore non nullo se si è nel processo padre e nullo se si è nel processo figlio.
Ottimo @apatriarca !
Stavo per scrivere la stessa cosa. Il mio consiglio è quello di inserire un
Magari si può modificare il codice in questo modo:
Stavo per scrivere la stessa cosa. Il mio consiglio è quello di inserire un
printf("%d", fork());in modo tale da osservare anche i processi e relativi PID.
Magari si può modificare il codice in questo modo:
int k(int l) { int i, pid, n=0; for(i=0; i<l; i++) { n*=2; pid = fork(); printf("%d", pid); if(pid) n+=1; } return n; }
Grazie mille a entrambi per le risposte, veramente esaustive, complimenti
