|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
[C] Domanda sulla funzione wait()
Salve a tutti, è la prima volta che scrivo in questo forum anche se seguo da molti anni il sito.
Avrei gentilmente bisogno, abbastanza urgentemente poichè domani ho un esame (non vi nascondo che ho già chiesto anche da altre parti), di un aiuto su un esercizio. Devo stabilire l'output di un programma e dire se quell'output è l'unico possibile. La mia domanda è: il wait() aspetta che una diramazione QUALSIASI del figlio finisca oppure aspetta necessariamente figlio->figlio, non facendo fare altro al figlio->padre? In pratica il programma stampa, nelle varie prove che ho fatto: 1 2 3 4 4 3 4 oppure (non sul mio pc, ma su quello di un amico) 1 2 3 4 3 4 4 Quello che cercavo di dire prima è se è possibile che il programma stampi 1 2 3 3 4 4 4, ovvero può il processo figlio->padre stampare il 3 prima che il processo figlio->figlio finisca? Il programma che mi ha fatto sorgere il dubbio è il seguente: codice: Codice:
#include <stdio.h>
#include <unistd.h>
int main()
{
printf ("1\n");
if (fork()==0)
{
printf ("2\n");
fork();
printf ("3\n");
}else
wait();
printf ("4\n");
}
Ringrazio già in anticipo chiunque mi risponderà! Ciao! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
la wait si sblocca quando termina un figlio (a dire il vero si sblocca anche quando vieni interrotto da un segnale, cosa che non controlli, e poi mancano un po' di wait per evitare gli zombie)
in pratica la wait che c'è lì si sblocca solo quando è terminato il processo generato dalla prima fork |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
Ti ringrazio, ma non mi hai detto niente di nuovo!
Io volevo sapere in pratica se può essere stampato 1 2 3 3 4 4 4... O meglio, so che si blocca quando termina il processo della prima fork(), ma dato che questo processo si duplica ancora, vorrei sapere se a finire e a sbloccare la wait() è il processo figlio->figlio, senza che il processo figlio->padre possa stampare qualcosa nel mentre. Con altre parole ancora, la wait() agisce anche sul figlio->padre? Ultima modifica di DP1991 : 13-02-2011 alle 16:08. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
forse non è chiaro, si sblocca se termina un figlio, non un nipote
![]() infatti dovresti fare la wait nel primo figlio per non avere il nipote zombie ![]() comunque quella stampa puoi averla p1: stampa 1 p1: fork() e genera p2 p1: stampa wait() e si blocca p2: stampa 2 p2: fork() e genera p3 p2: stampa 3 p3: stampa 3 p3: stampa 4 p3: termina p2: stampa 4 p2: termina p1: stampa 4 p1: termina è uno schedule legale Ultima modifica di tuccio` : 13-02-2011 alle 16:19. |
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
Ok, però allora perchè mi stampa 1 2 3 4 4 3 4??
Il secondo 4 è sicuramente quello del padre, quindi vuol dire che la wait si sblocca quando termina un "nipote", no?? |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
l'unica cosa che puoi dire lì è che figlio1 termina prima di padre, il 4 del padre può essere anche l'ultimo stampato, perché può terminare per ultimo ps: se a te stampa la stessa cosa è per come ragiona il tuo scheduler, il punto è solo che quello schedule non viene meno a nessun vincolo "di precedenza" (nel tuo caso c'è solo che figlio1 deve terminare prima che padre stampi 4), quindi è legale Ultima modifica di tuccio` : 13-02-2011 alle 16:46. |
|
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
Capisco quello che mi stai dicendo, ma io sono abbastanza sicuro che quello è il 4 del padre, perchè altrimenti dovrebbe avere davanti un 3, non credi? Il 4 dovrebbe essere sempre preceduto dal 3 a meno che non sia il 4 del padre oppure 3344...
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
ah sì nel tuo caso sì, ovviamente, pensavo parlassi di "1233444"
|
|
|
|
|
|
#10 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
Ok, penso sia chiaro ora.
Un'ultima cosa per ora, lo schema che ho postato è giusto secondo te? O meglio, è corretto vederla così, o c'è qualche errore logico? |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
dipende, come devo interpretare 2 comandi che stanno sulla stessa riga?
|
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Feb 2011
Messaggi: 7
|
Be, secondo quello che mi hai detto tu vanno "a caso", mentre io prima credevo facesse prima il ramo figlio1->figlio2 e poi padre e figlio->padre2 a caso...
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:22.






















