Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    [C] semplice programmino non capito,perchè stampa questo?

    In C sono ancora alle prime armi,sul mio libro ho trovato questo esercizio:
    codice:
    #include <sys/type.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int value=5;
    
    int main(){
    int pid;
    pid=fork();
    if(pid==0){
    value+=15;
    return 0;
    }else if(pid>0){
    wait(NULL);
    printf("PARENT: value = %d",value);
    return 0;
    }
    }
    avviando questo codice,vedo che ciò che è stampato a video è:
    PARENT: value = 5
    mentre io avrei detto che avrebbe stampato:
    PARENT: value = 20
    ma il problema è che non ho capito il perchè viene 5
    Ricapitolando:
    si crea una variabile intera value e la si inizializza a 5
    nel main viene invocata la system call fork per creare un nuovo processo e si salva il valore di ritorno del metodo in pid
    a questo punto entra nel secondo if (processo padre) che esegue il wait(NULL),se non sbaglio così facendo dovrebbe attendere la terminazione del codice del processo figlio,quindi si va nel primo if (relativo al codice del processo figlio) il quale incrementa value di 15,che a questo punto dovrebbe valere 20 ora l'esecuzione torna al padre che esegue il printf ma stampa il valore di value come 5 e non 20 come io credevo...mi spiegate il perchè?
    dov'è che sbaglio il mio ragionamento?

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C] semplice programmino non capito,perchè stampa questo?

    Originariamente inviato da zipangulu
    avviando questo codice,vedo che ciò che è stampato a video è:
    PARENT: value = 5
    mentre io avrei detto che avrebbe stampato:
    PARENT: value = 20
    ma il problema è che non ho capito il perchè viene 5
    Ricapitolando:
    si crea una variabile intera value e la si inizializza a 5
    nel main viene invocata la system call fork per creare un nuovo processo e si salva il valore di ritorno del metodo in pid
    a questo punto entra nel secondo if (processo padre) che esegue il wait(NULL),se non sbaglio così facendo dovrebbe attendere la terminazione del codice del processo figlio,quindi si va nel primo if (relativo al codice del processo figlio) il quale incrementa value di 15,che a questo punto dovrebbe valere 20 ora l'esecuzione torna al padre che esegue il printf ma stampa il valore di value come 5 e non 20 come io credevo...mi spiegate il perchè?
    dov'è che sbaglio il mio ragionamento?
    Per iniziare ti consiglio di indentare il codice, diventa tutto più leggibile (anche se sarebbe un po' da rivedere):
    codice:
    #include <sys/type.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int value = 5;
    
    int main() {
        int pid = fork();
        if (pid == 0) {
            value += 15;
            return 0;
        } else if (pid > 0){
            wait(NULL);
            printf("PARENT: value = %d", value);
            return 0;
        }
    }
    Ricorda che se pid == 0 sei nel codice del figlio. Con pid > 0 invece sei nel padre (in questo caso l'intero rappresenta il pid del processo figlio).

    Quindi all'interno del padre value varrà 20 mentre all'interno del figlio resta 5. Occhio che a partire dalla fork hai due processi differenti (in cui il figlio è la copia del padre), ognuno con la propria area di memoria! Il value del padre e quello del figlio ora sono due variabili diverse (se ricordo bene, è un po' che non programmo su unix).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    Re: Re: [C] semplice programmino non capito,perchè stampa questo?

    Originariamente inviato da Alex'87
    Quindi all'interno del padre value varrà 20 mentre all'interno del figlio resta 5.
    Penso volessi dire il contrario:all'interno del figlio vaule varrà 20 mentre nel padre resta 5.

    Originariamente inviato da Alex'87
    Occhio che a partire dalla fork hai due processi differenti (in cui il figlio è la copia del padre), ognuno con la propria area di memoria! Il value del padre e quello del figlio ora sono due variabili diverse (se ricordo bene, è un po' che non programmo su unix).
    Al fatto che ognuno ha poi la sua area di memoria ci avevo pensato anche io,volevo però averne conferma.

    Solo un dubbio ora mi sorge:ma se in tal modo ciascun processo ha la propria area di memoria come fanno i due ad interagire l'un l'altro?deve sempre e comunque instaurarsi tra loro un canale di comunicazione o per memoria condivisa o per invio/ricezioni messaggi?!mmm...pensavo che tra "padre/figlio" la cosa fosse automatica

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Re: Re: [C] semplice programmino non capito,perchè stampa questo?

    Originariamente inviato da zipangulu
    Penso volessi dire il contrario:all'interno del figlio vaule varrà 20 mentre nel padre resta 5.
    Sì scusa, mi sono confuso un attimo ^^'

    Originariamente inviato da zipangulu
    Solo un dubbio ora mi sorge:ma se in tal modo ciascun processo ha la propria area di memoria come fanno i due ad interagire l'un l'altro?deve sempre e comunque instaurarsi tra loro un canale di comunicazione o per memoria condivisa o per invio/ricezioni messaggi?!mmm...pensavo che tra "padre/figlio" la cosa fosse automatica
    Quando fai una fork il figlio eredita dal padre file aperti, variabili di ambiente, working directory. Per farlo comunicare col padre puoi creare una pipe, aprire una socket ecc. Prova a leggere qui, magari ci trovi qualcosa di utile
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.