Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55

    [C/C++] Eseguire in uscita...

    Esiste un modo per far eseguire una determinata parte di codice all'uscita del programma?? anche in caso viene interrotto bruscamente (Ctrl+C su linux)??

    Ciao Dave88...

  2. #2
    In win32 esiste la funzione atexit(), è inclusa nello standard ANSI C/C++, ma non so se in
    sistemi unix-like è suportata.

    codice:
     #include <stdio.h>
     #include <stdlib.h>
    
     void exit_fn1(void)
     {
        printf("Exit function #1 called\n");
     }
    
     void exit_fn2(void)
     {
        printf("Exit function #2 called\n");
     }
    
     int main(void)
     {
        /* post exit function #1 */
        atexit(exit_fn1);
        /* post exit function #2 */
        atexit(exit_fn2);
        return 0;
     }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    Ho appena provato il tuo metodo, ma putroppo non esegue le funzioni in caso di uscita inaspettata...poiche io per uscire da un ciclo (e dal programma) faccio Ctrl+C, mi servirebbe che eseguisse una funzione prima che chiudesse il programma...

  4. #4
    Originariamente inviato da dave88
    Ho appena provato il tuo metodo, ma putroppo non esegue le funzioni in caso di uscita inaspettata...poiche io per uscire da un ciclo (e dal programma) faccio Ctrl+C, mi servirebbe che eseguisse una funzione prima che chiudesse il programma...
    A me (compilo in win32) così funziona :
    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    void exit_func1()
    {
    	printf("Exit1 function called\n\n");
    }
    
    void exit_func2()
    {
    	printf("Exit2 function called\n\n");
    }
    
    int main()
    {
    	char str[261];
    	atexit(exit_func1);
    	atexit(exit_func2);
    	
    	fgets( str, 260, stdin );
    	return EXIT_SUCCESS;
    }
    Notare la differenza premendo CTRL-z e premendo CTRL-c.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    questo è in maniera molto semplificata il mio problema...a me non funzia su Unix...su win non saprei...
    Codice PHP:
    #include <stdio.h>
     #include <stdlib.h>

     
    void exit_fn1(void)
     {
        
    printf("Exit function #1 called\n");
     }

     
    void exit_fn2(void)
     {
        
    printf("Exit function #2 called\n");
     }

     
    int main(void)
     {
        
    atexit(exit_fn1);
        
    atexit(exit_fn2);
         while (
    true)
         {
             
         }
        return 
    0;
     } 

  6. #6
    Se sei su unix protresti provare ad intercettare il SIGINT tramite un gestore di segnali.
    Prova a cercare qualcosa sulle funzioni signal, sigemptyset e sigaction.

    Ciao

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Come ha già detto fastcoder, puoi intercettare SIGINT:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <signal.h>
    
    void exit_fn1 (void)
    {
        printf("Exit function #1 called\n");
    }
    
    void exit_fn2 (void)
    {
        printf("Exit function #2 called\n");
    }
    
    void sig_handler (int num)
    {
        exit (1);
    }
    
    
    int main (void)
    {
        signal (SIGINT, sig_handler);
    
        atexit (exit_fn1);
        atexit (exit_fn2);
    
        while (1) { }
    
        return 0;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    Grazie di cuore fastcoder e Andbin, ha funzionato perfettamente, e giusto per chi avesse lo stesso problema in futuro, l'intercettazione del segnale, quindi l'ultimo codice postato da andbin, è portabile (Windows/Linux) senza nessuna modifica.
    Grazie mille.

  9. #9
    Utente di HTML.it L'avatar di dave88
    Registrato dal
    Dec 2002
    Messaggi
    55
    Ma adesso ho un problema, e qui si fa un po piu nello specifico...
    ho una variabile, che ad ogni ciclo while viene incrementatata di 1...
    vorrei che nel momento in cui si arresta il programma, mi venga stampata codesta variabile,quindi, come faccio a passarla alla funzione "exit_fn1" ? poiche, si aspetta un void, non posso passare argomenti...fatemi sapere.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Dichiarala fuori dal main ...

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.