Differenze tra le versioni di "Ottenere la descrizione del tipo di errore dai file header "errno-base.h" e "errno.h""
(6 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Molte funzioni esterne in caso errore ritornano tipi di errore contenuti e descritti nei file header | + | Molte funzioni esterne in caso errore ritornano tipi di errore contenuti e descritti nei file header ''errno-base.h'' e ''errno.h''. |
Essendo tali file header sostanzialmente dei file di testo, è abbastanza agevole, volendo, estrarre da essi sulla base del valore di errore, ritornato dalla funzione esterna, la descrizione di questo presente nel file ''header''. | Essendo tali file header sostanzialmente dei file di testo, è abbastanza agevole, volendo, estrarre da essi sulla base del valore di errore, ritornato dalla funzione esterna, la descrizione di questo presente nel file ''header''. | ||
+ | Nell'esempio che segue, avremo una libreria condivisa esterna, da noi scritta in C, con la quale fingiamo di provocare un errore "EINVAL" (codice num. 22), che sarà successivamente raccolto dal nostro codice Gambas mediante il Metodo "[https://gambaswiki.org/wiki/comp/gb/system/error?l=it .Error]" della Classe nativa ''System''. | ||
+ | <FONT Color=gray>' ''void simula_errore()''</font> | ||
+ | Private Extern simula_errore() In "/tmp/liberrore" | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | Dim err As Integer | ||
+ | Dim fl As File | ||
+ | Dim s As String | ||
+ | |||
+ | <FONT Color=gray>' ''Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9":''</font> | ||
+ | Creaso() | ||
+ | |||
+ | <FONT Color=gray>' ''Simula la sollevazione di un errore "EINVAL":''</font> | ||
+ | simula_errore() | ||
+ | |||
+ | <FONT Color=gray>' ''Raccoglie l'errore:''</font> | ||
+ | err = System.Error | ||
+ | |||
+ | <FONT Color=gray>' ''Per intercettare l'errore può usare anche il Metodo "System.GetExternSymbol()":'' | ||
+ | ' '''Dim p As Pointer''' | ||
+ | ' '''p = System.GetExternSymbol("/tmp/liberrore", "errno")''' | ||
+ | ' '''err = Int@(p)'''</font> | ||
+ | |||
+ | fl = Open "/usr/include/asm-generic/errno-base.h" | ||
+ | |||
+ | For Each s In fl.Lines | ||
+ | If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1] | ||
+ | Next | ||
+ | fl.Close | ||
+ | |||
+ | fl = Open "/usr/include/asm-generic/errno.h" | ||
+ | For Each s In fl.Lines | ||
+ | If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1] | ||
+ | Next | ||
+ | fl.Close | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Private''' Procedure Creaso() | ||
+ | |||
+ | File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" & | ||
+ | "void simula_errore() {\n" & | ||
+ | " '''errno = EINVAL''';\n}") | ||
+ | |||
+ | Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait | ||
+ | |||
+ | '''End''' | ||
− | + | ====Usando la funzione "__errno_location()"==== | |
+ | Riprendendo il codice precedente, si potrà utilizzare anhe la funzione "[http://refspecs.linux-foundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/baselib---errno-location.html __errno_location()] per intercettare l'errore sollevato dal sistema. | ||
+ | <FONT Color=gray>' ''void simula_errore()''</font> | ||
+ | Private Extern simula_errore() In "/tmp/liberrore" | ||
+ | |||
+ | |||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
− | Dim | + | Dim err As Pointer |
Dim fl As File | Dim fl As File | ||
− | + | Dim s As String | |
− | <FONT Color=gray>' '' | + | |
− | + | <FONT Color=gray>' ''Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9":''</font> | |
+ | Creaso() | ||
+ | |||
+ | <FONT Color=gray>' ''Simula la sollevazione di un errore "EINVAL":''</font> | ||
+ | simula_errore() | ||
+ | |||
+ | <FONT Color=gray>' ''Raccoglie l'errore:''</font> | ||
+ | err = <FONT Color=#B22222>__errno_location()</font> | ||
+ | |||
+ | fl = Open "/usr/include/asm-generic/errno-base.h" | ||
+ | |||
+ | For Each s In fl.Lines | ||
+ | If s Like "* " & CStr(Int@(err)) & " *" Then Print "Errore n. "; CStr(Int@(err)); ": "; Scan(s, "*/*/*")[1] | ||
+ | Next | ||
+ | fl.Close | ||
+ | |||
+ | fl = Open "/usr/include/asm-generic/errno.h" | ||
+ | For Each s In fl.Lines | ||
+ | If s Like "* " & CStr(Int@(err)) & " *" Then Print "Errore n. "; CStr(Int@(err)); ": "; Scan(s, "*/*/*")[1] | ||
+ | Next | ||
+ | fl.Close | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Private''' Procedure Creaso() | ||
+ | |||
+ | File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" & | ||
+ | "void simula_errore() {\n" & | ||
+ | " '''errno = EINVAL''';\n}") | ||
− | + | Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''End''' | '''End''' |
Versione attuale delle 15:59, 6 ott 2022
Molte funzioni esterne in caso errore ritornano tipi di errore contenuti e descritti nei file header errno-base.h e errno.h.
Essendo tali file header sostanzialmente dei file di testo, è abbastanza agevole, volendo, estrarre da essi sulla base del valore di errore, ritornato dalla funzione esterna, la descrizione di questo presente nel file header.
Nell'esempio che segue, avremo una libreria condivisa esterna, da noi scritta in C, con la quale fingiamo di provocare un errore "EINVAL" (codice num. 22), che sarà successivamente raccolto dal nostro codice Gambas mediante il Metodo ".Error" della Classe nativa System.
' void simula_errore() Private Extern simula_errore() In "/tmp/liberrore" Public Sub Main() Dim err As Integer Dim fl As File Dim s As String ' Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9": Creaso() ' Simula la sollevazione di un errore "EINVAL": simula_errore() ' Raccoglie l'errore: err = System.Error ' Per intercettare l'errore può usare anche il Metodo "System.GetExternSymbol()": ' Dim p As Pointer ' p = System.GetExternSymbol("/tmp/liberrore", "errno") ' err = Int@(p) fl = Open "/usr/include/asm-generic/errno-base.h" For Each s In fl.Lines If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1] Next fl.Close fl = Open "/usr/include/asm-generic/errno.h" For Each s In fl.Lines If s Like "* " & CStr(err) & " *" Then Print "Errore n. "; CStr(err); ": "; Scan(s, "*/*/*")[1] Next fl.Close End Private Procedure Creaso() File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" & "void simula_errore() {\n" & " errno = EINVAL;\n}") Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait End
Usando la funzione "__errno_location()"
Riprendendo il codice precedente, si potrà utilizzare anhe la funzione "__errno_location() per intercettare l'errore sollevato dal sistema.
' void simula_errore() Private Extern simula_errore() In "/tmp/liberrore" Public Sub Main() Dim err As Pointer Dim fl As File Dim s As String ' Va a creare la libreria condivisa esterna, che simulerà la sollevazione di un errore "9": Creaso() ' Simula la sollevazione di un errore "EINVAL": simula_errore() ' Raccoglie l'errore: err = __errno_location() fl = Open "/usr/include/asm-generic/errno-base.h" For Each s In fl.Lines If s Like "* " & CStr(Int@(err)) & " *" Then Print "Errore n. "; CStr(Int@(err)); ": "; Scan(s, "*/*/*")[1] Next fl.Close fl = Open "/usr/include/asm-generic/errno.h" For Each s In fl.Lines If s Like "* " & CStr(Int@(err)) & " *" Then Print "Errore n. "; CStr(Int@(err)); ": "; Scan(s, "*/*/*")[1] Next fl.Close End Private Procedure Creaso() File.Save("/tmp/liberrore.c", "#include <errno.h>\n\n" & "void simula_errore() {\n" & " errno = EINVAL;\n}") Shell "gcc -o /tmp/liberrore.so /tmp/liberrore.c -shared" Wait End