PDA

View Full Version : [C] Domanda sulla funzione wait()


DP1991
13-02-2011, 13:13
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:

#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!

tuccio`
13-02-2011, 15:32
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

DP1991
13-02-2011, 15:52
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?

tuccio`
13-02-2011, 16:12
forse non è chiaro, si sblocca se termina un figlio, non un nipote :asd:

infatti dovresti fare la wait nel primo figlio per non avere il nipote zombie :asd:

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

DP1991
13-02-2011, 16:24
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??

DP1991
13-02-2011, 16:25
Io graficamente la vedo così:

http://img51.imageshack.us/img51/358/schermata1iy.th.png (http://img51.imageshack.us/i/schermata1iy.png/)

Uploaded with ImageShack.us (http://imageshack.us)

tuccio`
13-02-2011, 16:43
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??il secondo 4 non è per forza quello del padre, il fatto che figlio1 termini, permette al padre di sbloccarsi, ma non deve sbloccarsi per forza appena termina, è un'assunzione che non puoi fare

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

DP1991
13-02-2011, 16:49
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...

tuccio`
13-02-2011, 16:53
ah sì nel tuo caso sì, ovviamente, pensavo parlassi di "1233444"

DP1991
13-02-2011, 16:57
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?

tuccio`
13-02-2011, 17:03
dipende, come devo interpretare 2 comandi che stanno sulla stessa riga?

DP1991
13-02-2011, 17:13
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...