Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Sistemi Operativi, 9 CFU => Topic started by: milos224 on 25-07-2012, 14:34:49



Title: Fork e Pid
Post by: milos224 on 25-07-2012, 14:34:49
Ieri nel compito c'era un codice del genere.

Code:
int main() {
    int a,b,c;
a=getpid(); b=fork(); c=getppid();
    
    if(a!=c){
        //stampa qualcosa
    }
}

Ero convinto che a e c sono uguali, e quindi non stampa niente. Vi spiego il mio ragionamento (credo sbagliato a questo punto):all'inizio abbiamo un solo processo e con "a" recupero il Pid. Poi il processo viene duplicato con "b" e con "c" recuperiamo il Pid del padre, che a questo punto è uguale al primo pid ovvero "a". Sbaglio?


Title: Re:Fork e Pid
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 25-07-2012, 16:22:54
Ieri nel compito c'era un codice del genere.

Code:
int main() {
    int a,b,c;
a=getpid(); b=fork(); c=getppid();
    
    if(a!=c){
        //stampa qualcosa
    }
}

Ero convinto che a e c sono uguali, e quindi non stampa niente. Vi spiego il mio ragionamento (credo sbagliato a questo punto):all'inizio abbiamo un solo processo e con "a" recupero il Pid. Poi il processo viene duplicato con "b" e con "c" recuperiamo il Pid del padre, che a questo punto è uguale al primo pid ovvero "a". Sbaglio?
Nel momento in cui fork restituisce senza errori, si genera il figlio, che è un processo identico al padre per quanto riguarda il codice e le risorse aperte.
Solo che nel padre b sarà assegnato col PID del figlio, e nel figlio b sarà assegnato con zero (0).
a invece è stato assegnato (in entrambi i codici, che condividono copia dei dati assegnati prima della fork) con il pid del padre in entrambi i processi.
Poi c è stato assegnato col PID del padre di ciascuno dei processi (quindi il padre avrà in c il PID del nonno :boh, e il figlio avrà in c il PID del padre .smile).
Perciò, il controllo finale (a!=c):
- nel padre sarà valutato come falso, sempre, perché il getppid del padre (c) è il nonno mentre getpid del padre (a) è il padre stesso
- nel figlio sarà valutato come vero, sempre, perché il getppid del figlio (c) è il padre e getpid del padre (a) è appunto il padre pure.

Buona serata .ciaociao.


Title: Re:Fork e Pid
Post by: milos224 on 25-07-2012, 16:34:12
[...]
Perchè a è stato inizializzato prima della fork giusto?


Title: Re:Fork e Pid
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 25-07-2012, 19:12:37
Perchè a è stato inizializzato prima della fork giusto?
Sì.


Title: Re:Fork e Pid
Post by: Daréios89 on 26-08-2012, 23:39:31
Quote
Solo che nel padre b sarà assegnato col PID del figlio, e nel figlio b sarà assegnato con zero (0).

Quindi la fork nel caso del padre restituisce un valore maggiore di 0 che corrisponde al valore del PID del figlio, mentre nel figlio sarà 0?


Title: Re:Fork e Pid
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 28-08-2012, 08:10:13
Quote
Solo che nel padre b sarà assegnato col PID del figlio, e nel figlio b sarà assegnato con zero (0).

Quindi la fork nel caso del padre restituisce un valore maggiore di 0 che corrisponde al valore del PID del figlio, mentre nel figlio sarà 0?
Sì...  .penso..


Title: Re:Fork e Pid
Post by: zElOtO on 22-09-2012, 15:58:22
Ieri nel compito c'era un codice del genere.

Code:
int main() {
    int a,b,c;
a=getpid(); b=fork(); c=getppid();
    
    if(a!=c){
        //stampa qualcosa
    }
}

Ero convinto che a e c sono uguali, e quindi non stampa niente. Vi spiego il mio ragionamento (credo sbagliato a questo punto):all'inizio abbiamo un solo processo e con "a" recupero il Pid. Poi il processo viene duplicato con "b" e con "c" recuperiamo il Pid del padre, che a questo punto è uguale al primo pid ovvero "a". Sbaglio?
Nel momento in cui fork restituisce senza errori, si genera il figlio, che è un processo identico al padre per quanto riguarda il codice e le risorse aperte.
Solo che nel padre b sarà assegnato col PID del figlio, e nel figlio b sarà assegnato con zero (0).
a invece è stato assegnato (in entrambi i codici, che condividono copia dei dati assegnati prima della fork) con il pid del padre in entrambi i processi.
Poi c è stato assegnato col PID del padre di ciascuno dei processi (quindi il padre avrà in c il PID del nonno :boh, e il figlio avrà in c il PID del padre .smile).
Perciò, il controllo finale (a!=c):
- nel padre sarà valutato come falso, sempre, perché il getppid del padre (c) è il nonno mentre getpid del padre (a) è il padre stesso
- nel figlio sarà valutato come vero, sempre, perché il getppid del figlio (c) è il padre e getpid del padre (a) è appunto il padre pure.

Buona serata .ciaociao.

Grazie per l'accurata spiegazione, mi è stata molto utile!  :-OK


Title: Re:Fork e Pid
Post by: jos90 on 24-09-2012, 01:22:36
Ieri nel compito c'era un codice del genere.

Code:
int main() {
    int a,b,c;
a=getpid(); b=fork(); c=getppid();
    
    if(a!=c){
        //stampa qualcosa
    }
}

...

Poi c è stato assegnato col PID del padre di ciascuno dei processi (quindi il padre avrà in c il PID del nonno :boh, e il figlio avrà in c il PID del padre .smile).
Perciò, il controllo finale (a!=c):
- nel padre sarà valutato come falso, sempre, perché il getppid del padre (c) è il nonno mentre getpid del padre (a) è il padre stesso
- nel figlio sarà valutato come vero, sempre, perché il getppid del figlio (c) è il padre e getpid del padre (a) è appunto il padre pure.

Buona serata .ciaociao.

Scusate l'intromissione, ma mi chiedevo se il mio ragionamento fosse corretto.
Stò inserendo dei numeri per praticità:
processo padre a=getpid() [100] e c=getppid() [98] ;
processo figlio a=getpid() = [100] e c=getppid() = [100] .

Il controllo finale:

if(a!=c){
        //stampa qualcosa
    }

Non dovrebbe essere così? :
- vero nel processo padre, in quanto sono pid diversi (quindi a!=c e stampa)
- falso nel processo figlio, in quanto hanno lo stesso PID (quindi a==c)

o forse mi sta sfuggendo qualcosa? @-@


Title: Re:Fork e Pid
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 24-09-2012, 13:36:10
Giustooooooooo!!! Ma che stavo pensando quando ho scritto quella cosa l'altra volta :boh? :-)| :pray .arrossisco


Title: Re:Fork e Pid
Post by: jos90 on 24-09-2012, 14:11:40
Ah ok grazie, è che sono ancora nuovo con tutti questi approcci, quindi non ne ero sicuro! xD