Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    [C] Allocazione dinamica...

    Ciao, ho un problemuccio urgente da capire...
    Si tratta di realizzare un semplice server che ad ogni
    richiesta ricevuta mediante pipe crei u proceso ad hoc
    per svolgere una certa funzione calcolando il tempo di
    esecuzione impiegato dal processo figlio. In partciolare
    dovrei fare qualcosa di questo genere:
    codice:
    ...
    struct timeval * start;
    struct timeval * end;
    long int med;
    ...
    int main(int argc, char * argv[])
    {
    ...
    /*Per gestire il sigchld...*/
    struct sigaction new, old;
    new.sa_handler = deadHandler;
    if(sigaction(SIGCHLD, &new, &old) == -1)
    {
    perror("Errore nella sigaction");
    exit(-1);
    }
    
    while (TRUE)
    {
    /*RICEZIONE DELLE RICHIESTE*/
    int pid;
    start = (struct timeval*) malloc (sizeof(struct timeval));
    end = (struct timeval*) malloc (sizeof(struct timeval)); 
    gettimeofday(start,NULL);
    pid = fork();
    if (pid ==0)/*Figlio*/
    {
    funzione1(...qui passo i parametri giusti...);
    exit(0);
    }
    /*Il padre torna a ricevere richieste...*/
    }
    
    /*Routine per la gestione del segnale sigchld...*/
    void deadHandler(int sig)
    {
    getimeofday(end,NULL);
    long int execTime = (end->tv_sec - start->tv_sec) * 1000000 + 
                        (end->tv_usec - start->tv_usec);
    med = ALPHA * med + (1-ALPHA) * execTime;
    }
    Il mio problema e' questo:
    il padre non sa a priori quando entrera' nella routine per
    gestire il sigchld. Pertanto vorrei sapere questo: quando
    entro nella deadHandler(...) la PRIMA volta, accedendo alla
    varibile START, faccio riferimento alla sua PRIMA allocazione
    (E quindi al suo primo valore)?! E quindi quando accedo alla
    routine la SECONDA volta faccio riferimento alla SECONDA
    allocazione della variabile oppure no ?!? E cosi' via...
    In altre parole quando entro nella routine di gestione del
    sigchld la PRIMA volta ed accedo a start, quest'ultima potrebbe essere stata sovrascritta perche' nel frattempo il
    server ha ricevuto una (o piu') ulteriore richiesta e quindi
    ha dato un nuovo valore a start ?! Oppure il fatto che
    utilizzi la allocazione dinamica mi cautela da questo
    "problema". (In pratica dovrebbe succedere qualcosa di simile a quello che accade nella ricorsione per fare in modo che gli
    effetti siano quelli "desiderati"...)

    Scusate se ho scritto una marea di roba e se, oltretutto...
    sono stato pure poco chiaro...

    thks

  2. #2
    Utente di HTML.it L'avatar di MMarzia
    Registrato dal
    Mar 2001
    Messaggi
    1,781

    Re: [C] Allocazione dinamica...

    Originariamente inviato da Ed_Bunker
    Scusate se ho scritto una marea di roba e se, oltretutto...
    sono stato pure poco chiaro...

    thks
    più che altro la prossima volta non esagerare con la grandezza del carattere
    io sono festosamente cicciottello :: e. cartman

    t'amo senza sapere come, nè quando nè da dove,
    t'amo direttamente senza problemi nè orgoglio:
    così ti amo perchè non so amare altrimenti

  3. #3
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    Re: Re: [C] Allocazione dinamica...

    Originariamente inviato da MMarzia
    più che altro la prossima volta non esagerare con la grandezza del carattere
    Mi hai beccato mentre lo stavo modificando. Alla fine l'avevo messo a 4. E mi hai fatto subito il "cazziatone"...

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    La deadHandler viene chiamata dal processo figlio? Cioè nel ramo (pid == 0) del l'if? Se è cosi dovresti tenere presente che il figlio è un processo separato dal padre e quindi i due lavorano in zone di memoria completamente indipendenti; questo significa che il valore di start a cui accede il figlio è quello che tale variabile aveva prima della fork, e anche se nel frattempo il padre ha nuovamente allocato spazio per start, lo ha allocato nel suo spazio di memoria, non in quello del figlio, in cui start resterà immodificato.


  5. #5
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da anx721
    La deadHandler viene chiamata dal processo figlio? Cioè nel ramo (pid == 0) del l'if? Se è cosi dovresti tenere presente che il figlio è un processo separato dal padre e quindi i due lavorano in zone di memoria completamente indipendenti; questo significa che il valore di start a cui accede il figlio è quello che tale variabile aveva prima della fork, e anche se nel frattempo il padre ha nuovamente allocato spazio per start, lo ha allocato nel suo spazio di memoria, non in quello del figlio, in cui start resterà immodificato.

    La deadHandler(...) viene chiamata dal padre. Il mantenimento dei tempi di esecuzione e' "sua esclusiva". I processi figli hanno solo il compito di svolgere la funzione.

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.