Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-07-2010, 13:36   #1
monelli
Senior Member
 
L'Avatar di monelli
 
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 14:10.
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:06   #2
tuccio`
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
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:10   #3
monelli
Senior Member
 
L'Avatar di monelli
 
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!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:22   #4
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da monelli Guarda i messaggi
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
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
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:33   #5
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
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

??????
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!

Ultima modifica di monelli : 16-07-2010 alle 14:37.
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:37   #6
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
Quote:
Originariamente inviato da monelli Guarda i messaggi
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
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:40   #7
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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;
}
Intanto, come avete già notato, si parte da 1 anziché da 2.
Ci sono due possibilità:
  1. la prima fork() fallisce
  2. 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.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!

Ultima modifica di DanieleC88 : 16-07-2010 alle 14:45.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:44   #8
monelli
Senior Member
 
L'Avatar di monelli
 
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!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:52   #9
monelli
Senior Member
 
L'Avatar di monelli
 
Iscritto dal: Feb 2007
Città: Imperia "S.S.28"
Messaggi: 905
Quote:
Originariamente inviato da tuccio` Guarda i messaggi
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
__________________
Dont drink and drive but smoke and fly
Peugeot 206 enfant terrible!!!
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 14:59   #10
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
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!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 04-07-2011, 21:30   #11
Jin2011
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
Jin2011 è offline   Rispondi citando il messaggio o parte di esso
Old 04-07-2011, 23:12   #12
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
posta una domanda e qualcuno ti risponderà :v
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 05-07-2011, 19:33   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13043
Quanto è brutta la fork... ogni volta che la vedo mi accorgo di quanto fa cacare il suo comportamento
WarDuck è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:16.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v