Differenze tra le versioni di "Atexit ()"
Riga 16: | Riga 16: | ||
− | + | 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> | <FONT Color=gray>' ''Va a creare la nostra appostita libreria dinamica condivisa per la gestione sicura della funzione esterna "atexit()":''</font> | ||
Riga 35: | Riga 35: | ||
If i <> 0 Then Error.Raise("Errore alla funzione esterna 'atexit()' !") | 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" & | File.Save("/tmp/libatx.c", "#include <stdio.h>\n#include <stdlib.h>\n\n\n" & | ||
Riga 58: | Riga 58: | ||
Shell "gcc -o /tmp/libatx.so /tmp/libatx.c -shared -fPIC" Wait | Shell "gcc -o /tmp/libatx.so /tmp/libatx.c -shared -fPIC" Wait | ||
− | + | End | |
− | |||
Versione attuale delle 18:51, 12 giu 2024
La funzione atexit(), dichiarata nel file header "/usr/include/stdlib.h":
int atexit(void (*__func) (void))
registra una funzione che deve essere invocata all'atto di un normale termine di un processo. Il termine del processo, dunque, deve essere previsto dal codice del programma, non determinato da un crash.
In sostanza la funzione "atexit( )" fa sì che il sistema, al termine del processo di un programma, chiami la funzione indicata nel suo unico parametro, ancorché la stessa "atexit( )" sia 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