Differenze tra le versioni di "Atexit ()"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "La funzione '''atexit()''', dichiarata nel file header "''/usr/include/stdlib.h''": int atexit(void (*function)(void)) registra una funzione che deve essere invocata all'atto...")
 
Riga 1: Riga 1:
 
La funzione '''atexit()''', dichiarata nel file header "''/usr/include/stdlib.h''":
 
La funzione '''atexit()''', dichiarata nel file header "''/usr/include/stdlib.h''":
 
  int atexit(void (*function)(void))
 
  int atexit(void (*function)(void))
registra una funzione che deve essere invocata all'atto del termine di un processo. In sostanza, dunque, la funzione "''atexit( )''" fa sì che il sistema, al termine del processo di un programma, chiami la funzione indicata nel suo unico parametro, anche se la stessa sia posta nelle parti iniziali del codice del programma.
+
registra una funzione che deve essere invocata all'atto del termine di un processo. In sostanza, dunque, la funzione "''atexit( )''" fa sì che il sistema, al termine del processo di un programma, chiami la funzione indicata nel suo unico parametro, anche se la stessa è posta nella parte iniziale del codice del programma.
  
 +
Nell'uso diretto con ''Extern'' in Gambas si è riscontrata la sollevazione di un errore (codice 11). Pertanto, per poter comunque usufruire in Gambas delle facoltà fornite dalla funzione esterna "''atexit( )''", è necessario porre sia questa che la funzione, da essa chiamata, in un'unica funzione esterna posta in una apposita libreria dinamica condivisa .so, da noi creata.
  
  
<FONT COLOR=red size=4><B>Pagina in costruzione !</b></font>
+
Mostriamo un semplice esempio pratico:
 +
Library "/tmp/libatx"
 +
 +
<FONT Color=gray>' ''int Atx (void)''
 +
' ''Consente di usare la funzione esterna "atexit()".''</font>
 +
Private Extern Atx() As Integer
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
  Dim i, n As Integer
 +
 
 +
<FONT Color=gray>' ''Va a creare la nostra appostita libreria dinamica condivisa per la gestione sicura della funzione esterna "atexit()":''</font>
 +
  CreaSo()
 +
 
 +
<FONT Color=gray>' ''Invoca la funzione esterna presente nella libreria condivisa da noi creata per usare la funzione esterna 'atexit()':''</font>
 +
  i = Atx()
 +
 
 +
<FONT Color=gray>' ''Fa ad esempio prima qualcosa con alcune istruzioni:''</font>
 +
  n = 3 + 9
 +
  Print n
 +
  n = Calculus(n)
 +
  Print n
 +
  Print "testo qualsiasi\n"
 +
 
 +
  If i <> 0 Then Error.Raise("Errore alla funzione esterna 'atexit()' !")
 +
 
 +
'''End'''
 +
 +
 +
'''Private''' Function Calculus(vl As Integer) As Integer
 +
 
 +
  Return vl ^ 3
 +
 
 +
'''End'''
 +
 +
 +
'''Private''' Procedure CreaSo()
 +
 
 +
  File.Save("/tmp/libatx.c", "#include <stdio.h>\n#include <stdlib.h>\n\n\n" &
 +
            "void chiamata() {\n\n" &
 +
            "  printf(\"Chiamata della funzione con 'atexit()' !\");\n\n}" &
 +
            "\n\n\n" &
 +
            "int Atx() {\n\n" &
 +
            "  int i;\n\n" &
 +
            "  i = atexit(chiamata);\n\n" &
 +
            "  return i;\n\n}")
 +
         
 +
  Shell "gcc -o /tmp/libatx.so /tmp/libatx.c -shared -fPIC" Wait
 +
 
 +
'''End'''
 +
 
 +
 
 +
 
 +
 
 +
=Riferimenti=
 +
* http://man7.org/linux/man-pages/man3/atexit.3.html
 +
* https://www.gnu.org/software/libc/manual/html_node/Cleanups-on-Exit.html

Versione delle 07:28, 9 giu 2017

La funzione atexit(), dichiarata nel file header "/usr/include/stdlib.h":

int atexit(void (*function)(void))

registra una funzione che deve essere invocata all'atto del termine di un processo. In sostanza, dunque, la funzione "atexit( )" fa sì che il sistema, al termine del processo di un programma, chiami la funzione indicata nel suo unico parametro, anche se la stessa è posta nella parte iniziale del codice del programma.

Nell'uso diretto con Extern in Gambas si è riscontrata la sollevazione di un errore (codice 11). Pertanto, per poter comunque usufruire in Gambas delle facoltà fornite dalla funzione esterna "atexit( )", è necessario porre sia questa che la funzione, da essa chiamata, in un'unica funzione esterna posta in una apposita libreria dinamica condivisa .so, da noi creata.


Mostriamo un semplice esempio pratico:

Library "/tmp/libatx"

' int Atx (void)
' Consente di usare la funzione esterna "atexit()".
Private Extern Atx() As Integer


Public Sub Main()
 
 Dim i, n As Integer
 
' Va a creare la nostra appostita libreria dinamica condivisa per la gestione sicura della funzione esterna "atexit()":
  CreaSo()
  
' Invoca la funzione esterna presente nella libreria condivisa da noi creata per usare la funzione esterna 'atexit()':
  i = Atx()
  
' Fa ad esempio prima qualcosa con alcune istruzioni:
  n = 3 + 9
  Print n
  n = Calculus(n)
  Print n
  Print "testo qualsiasi\n"
  
  If i <> 0 Then Error.Raise("Errore alla funzione esterna 'atexit()' !")
  
End


Private Function Calculus(vl As Integer) As Integer
 
 Return vl ^ 3
 
End


Private Procedure CreaSo()
 
 File.Save("/tmp/libatx.c", "#include <stdio.h>\n#include <stdlib.h>\n\n\n" &
           "void chiamata() {\n\n" &
           "  printf(\"Chiamata della funzione con 'atexit()' !\");\n\n}" &
           "\n\n\n" &
           "int Atx() {\n\n" &
           "  int i;\n\n" &
           "  i = atexit(chiamata);\n\n" &
           "  return i;\n\n}")
          
 Shell "gcc -o /tmp/libatx.so /tmp/libatx.c -shared -fPIC" Wait
  
End



Riferimenti