Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-07-2010, 14: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 15:10.
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 15: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, 15: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, 15: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, 15: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 15:37.
monelli è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 15: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, 15: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 15:45.
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 16-07-2010, 15: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, 15: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, 15: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, 22: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 05-07-2011, 00: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, 20:33   #13
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 12945
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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Arianespace potrebbe lanciare il primo r...
Google Pixel 10a disponibile al prezzo m...
Microsoft Copilot nei guai: email riserv...
AOC a 399€ su Amazon: QD-OLED 240 Hz e 0...
La Cina ha recuperato dal mare il primo ...
Boeing CST-100 Starliner: la NASA rende ...
hiop e TaDa uniscono le forze per trasfo...
Thermal Grizzly mostra il Ryzen 7 9850X3...
AMD Ryzen 'Olympic Ridge' Zen 6 per desk...
Donald Trump renderà pubbliche in...
Prezzo mai visto da mesi: ECOVACS DEEBOT...
Non solo S26, Samsung sta per lanciare a...
Windows 11 avrà a breve uno Speed...
Ask Intel: l'assistente IA che ti aiuta ...
Nasce Freedom.gov: il portale USA per ag...
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: 22:01.


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