Pages: [1]   Go Down
Print
Author Topic: Fork e Pid  (Read 3024 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
milos224
Forumista
***
Offline Offline

Posts: 830


« 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?
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 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 ).
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 .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
milos224
Forumista
***
Offline Offline

Posts: 830


« Reply #2 on: 25-07-2012, 16:34:12 »

[...]
Perchè a è stato inizializzato prima della fork giusto?
« Last Edit: 25-07-2012, 19:12:28 by reversengineer » Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 25-07-2012, 19:12:37 »

Perchè a è stato inizializzato prima della fork giusto?
Sì.
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #4 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?
« Last Edit: 26-08-2012, 23:42:01 by Daréios89 » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #5 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ì...  ..
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
zElOtO
Forumista
***
Offline Offline

Gender: Male
Posts: 845



WWW
« Reply #6 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 ).
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 .

Grazie per l'accurata spiegazione, mi è stata molto utile!  ok
Logged

I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. Insieme sono una potenza che supera l'immaginazione. (A. Einstein)

Damiano Cancemi
www.damianocancemi.com
www.nerdbren.com
www.nerdbren.com/blog
jos90
Apprendista Forumista
**
Offline Offline

Posts: 171



« Reply #7 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 ).
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 .

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? @-@
« Last Edit: 24-09-2012, 01:26:05 by jos90 » Logged

Perchè non pensi di non capire, quando capisci di non pensare?
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #8 on: 24-09-2012, 13:36:10 »

Giustooooooooo!!! Ma che stavo pensando quando ho scritto quella cosa l'altra volta boh? testate pray
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
jos90
Apprendista Forumista
**
Offline Offline

Posts: 171



« Reply #9 on: 24-09-2012, 14:11:40 »

Ah ok grazie, è che sono ancora nuovo con tutti questi approcci, quindi non ne ero sicuro! xD
Logged

Perchè non pensi di non capire, quando capisci di non pensare?
Pages: [1]   Go Up
Print
Jump to: