Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2009
    Messaggi
    88

    [C]problema inizializzazione struttura dei processi

    ho realizzato un piccolo programmino che crea n processi, i processi figli vengono inizializzati in una struttara dati.

    codice:
    #include <sys/types.h> /* pid_t */
    #include <sys/wait.h>
    #include <unistd.h>    /* fork */
    #include <stdio.h>
    #include <stdlib.h>    /* exit */
    typedef struct {
      
      char *nome;
      int eta;
      int cod;
    }Persona;
    static int count=0;
    int main (){
      
      pid_t child;
      Persona p[100];
      int i;//count=0;
      for (i=0;i<4;i++){
        child=fork();
        if (child==-1)
          perror("errore");
        
        if (child==0){
          fprintf(stdout,"Esecuzione del figlio %d\n",i);
          count++;
          p[i].cod=getpid();
          p[i].nome="pino";
          p[i].eta=40+i;
         // fprintf(stderr,"nome: %s, eta: %d cod= %ld\n",p[i].nome,p[i].eta,(long)p[i].cod);
          exit(i);
        }
        else {
          int status;
         wait(&status);
          fprintf(stdout,"sono il padre %d\n",i);
          
        }
          
        
      }
       fprintf(stdout," count: %d ",i);
       
      for (i=0;i<1;i++){
        //fprintf(stderr,"nome: %s, eta: %d cod= %ld\n",p[i].nome,p[i].eta,(long)p[i].cod);
        fprintf(stdout," count: %d ",count);
      }
        
      return 0;
    }
    Alla fine del ciclo for stampa count sempre 0 mentre la variabile i 4 errore di segmentazione per la stampa della struttura.
    Ho notato che la stampa della struttara funziona solo nel ciclo while ovvero quando viene creato il processo ed inizializzato.
    Come posso tenere traccia dei processi precedentemente inizializzati anche se hanno terminato la loro esecuzione

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Le modifiche alle varie strutture (nonché alla variabile count) che fai all'interno dei processi figli sono "visibili" solo da loro. Nel momento in cui richiami una fork() il sistema crea un nuovo processo che ha una copia esatta dello spazio di indirizzamento del processo padre (in realtà c'è il copy-on-write ma non ci interessa), quindi le modifiche che fai alle varie struct in ogni processo figlio non saranno riportate anche nell'area di memoria del processo padre, a meno che non usi meccanismi di comunicazione tra processi (come le pipe o la memoria condivisa). In questo caso però basta semplicemente che le modifiche alle struct (così come a count) le faccia direttamente il processo padre, che ha il pid del figlio nella sua variabile child, anche se in tutta sincerità non ho capito cosa te ne fai poi di N struct che riportano dei dati e dei pid di processi ormai terminati.

    Tra parentesi, dichiarare globale statica o di qualsiasi altro modo una variabile non ti consentirà di "condividerla" tra processi. Non confondere processi e funzioni che cono concetti completamente diversi. Per fare una cosa del genere devi utilizzare la libreria per la condivisione della memoria con le varie funzioni tipo shmget() e simili, ma per il caso in questione mi sembra eccessivo. Volendo puoi anche "convertire" i processi in thread, in questo modo non avrai problemi di condivisione della memoria.

    E dato che ci sono: far terminare un processo che non ha riportato errori con uno stato diverso da 0 (è il caso di tutti i processi figli a parte il primo) non è conforme alle convenzioni che vorrebbero 0 come stato di terminazione regolare, inoltre alla wait() puoi anche passare NULL se non hai bisogno di controllare lo stato di terminazione del processo figlio (visto che poi con la variabile status non ci fai nulla).
    every day above ground is a good one

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