Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    98

    [C/C++] Problema valori PID nell'suo della fork

    Raga ho provato a creare un piccolo programmino che attivi un figlio che a sua volta ne attivi un altro gestendo le rispettive terminazioni. Ecco il codice:

    codice:
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        pid_t pid, child1, child2;
        int parent, status1, status2, ret1, ret2;
    
        pid = fork();
        if(pid==0)
        {
            child1 = getpid();
            cout << "(child1) PID->" << getpid()
                 << "\t parent PID->" << getppid() << endl;
            cout << "(child1) Creo un nuovo processo" << endl;
            pid = fork();
            if(pid==0)
            {
                child2 = getpid();
                cout << "(child2) PID->" << getpid()
                     << "\t parent PID->" << getppid() << endl;
                cout << "(child2) Mi metto a fare qualcosa prima di terminare" << endl;
                for(int i=0; i<2; i++)
                {
                    system("sleep 1");
                    cout << "(child2)..." << endl;
                }
                exit(0);
                cout << "(child2) Processo Terminato" << endl;
            }
            else
            {
                cout << "(child1) Attendo terminazione processo child2" << endl;
                cout << "(child1) Mi metto a fare qualcosa prima di terminare" << endl;
                for(int j=0; j<2; j++)
                {
                    system("sleep 1");
                    cout << "(child1)..." << endl;
                }
                ret1 = waitpid(child2,&status2,0);
                cout << "(child1) Mio figlio è terminato e ora "
                     << "posso terminare anche io" << endl;
                exit(0);
            }
        }
        else
        {
            cout << "(parent) PID->" << getpid() << endl;
            cout << "(parent) Attendo terminazione processo child1" << endl;
            ret2 = waitpid(child1, &status1, 0);
            cout << "(parent) Mio figlio è terminato e ora "
                 << "posso terminare anche io" << endl;
            cout << "child1:" << child1 << endl;
            cout << "child2:" << child2 << endl;
                exit(0);
        }
       
       
        return 0;
    }
    Nel momento in cui lo lancio ho un problema in quanto le variabili child1 e child2 non contengono l'effettivo PID del processo a cui fanno riferimento e quindi non posso gestire in maniera corretta la terminazione dei due figli.

    Questa è l'uscita a terminale:

    codice:
    (child1) PID->8129       parent PID->8128
    (child1) Creo un nuovo processo
    (parent) PID->8128
    (parent) Attendo terminazione processo child1
    (parent) Mio figlio è terminato e ora posso terminare anche io
    child1:11026
    child2:-1202902016
    xxx@xxx-desktop:~/SCalls$ (child2) PID->8130     parent PID->8129
    (child2) Mi metto a fare qualcosa prima di terminare
    (child1) Attendo terminazione processo child2
    (child1) Mi metto a fare qualcosa prima di terminare
    (child1)...
    (child2)...
    (child1)...
    (child1) Mio figlio è terminato e ora posso terminare anche io
    (child2)...
    Qualcuno mi aiuta a capire questa cosa? Sto uscnedo pazzo :S

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C/C++] Problema valori PID nell'suo della fork

    Originariamente inviato da sccc
    Qualcuno mi aiuta a capire questa cosa? Sto uscnedo pazzo :S
    Oh certo, te lo dico subito.
    La "biforcazione" dei processi sui sistemi Unix/Linux usa una tecnica che si chiama COW, copy-on-write. Subito dopo la fork() i due processi padre e figlio "condividono" le stesse identiche pagine di memoria. Alla prima scrittura da parte di uno dei due, la pagina viene duplicata e quindi separata tra padre e figlio.

    Il concetto alla base è questo ed è molto importante da capire.
    Ciò significa che un processo figlio non potrà scrivere nelle pagine del processo padre (e idem viceversa) e pertanto il processo padre non potrà "vedere" ciò che il figlio ha modificato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.