[C-unix] facilities IPC, terminazione pulita

di il
3 risposte

[C-unix] facilities IPC, terminazione pulita

Ciao, ho un dubbio su come comportarmi se in un programma in cui creo delle facilities IPC , si verifichi un errore.
Es.

int main (void){
     //creo semafori, code di messagi e shared memory
     .......
     int fd_in; 
     if (( fd_in = open (in_file, O_RDONLY )) < 0 ){
		     perror("open ");
           // che faccio?
		     exit (EXIT_FAILURE);
     }
     .......
}

Nel esempio, nel caso la open fallisca come faccio a deallocare tutte le facilities IPC?
L'unica cosa che mi viene in mente sarebbe usare una funzione che deallochi tutto, ma non credo sia una buona soluzione .
Potreste darmi qualche consiglio?
Grazie

3 Risposte

  • Re: [C-unix] facilities IPC, terminazione pulita

    Se fai una exit e il programma termina, le risorse sono liberate.
  • Re: [C-unix] facilities IPC, terminazione pulita

    Grazie per la risposta ma nei sistemi unix-like semafori e shared memory (se non sbaglio fanno eccezione le code dei messaggi) sono kernel persistence, ovvero se non esplicitamente deallocate rimangono in memoria fino al riavvio del sistema.
    Il problema è appunto che devo deallocarle manualmente da terminale in caso di errore del programma.
  • Re: [C-unix] facilities IPC, terminazione pulita

    nei sistemi unix-like
    non solo li...
    e la risposta di oregon è perfetta!
    Ad esempio il significato di memoria condivisa è che piu processi possono leggere da una pagina della memoria, appunto condivisa.
    Questo presuppone che sia caricata prima che i processi la vadano a cercare e deallocata dopo che tutti i processi non la usano piu.
    La logica quindi fa presumere che venga caricata all'avvio del computer e deallocata al suo termine.
    Mentre un processo si "aggancerà" a tale memoria manualmente mentre si "sgangerà" dalla memoria o manualmente o automaticamente (grazie ad il s.o.)

    ora durante il processo di "inizializzazione" della memoria globale è naturalmente ovvio che se incontri in degli errori tu debba deallocare manualmente tutto ciò che hai precedentemente allocato.
    Scrivere una funzione che deallochi tutto anche se non esiste semplifica la vita.
    Non sei entrato nello specifico di cosa come e perchè quindi le risposte rimangono vaghe.
Devi accedere o registrarti per scrivere nel forum
3 risposte