Differenze tra le versioni di "Exit ()"

Da Gambas-it.org - Wikipedia.
(Pagina svuotata)
Riga 1: Riga 1:
La funzione della libreria di C
 
void exit(int status)
 
termina il programma. I buffer dei file vengono svuotati, i flussi sono chiusi, ed i file temporanei vengono eliminati.
 
  
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta. Da sottolineare che, poiché questa funzione esterna di C "''exit''" è <SPAN style="text-decoration:underline">omonima</span> alla funzione di Gambas "''Exit''", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando ''Exec''.
 
<BR>Il parametro della funzione sarà posto a zero.
 
<BR>Dunque avremo ad esempio:
 
Private <FONT color=#B22222>Extern exit_C</font>(status As Integer) In "<FONT color=#B22222>libc:6"</font> <FONT color=#B22222>'''Exec "exit"'''</font>
 
 
 
 
Semplice esempio di uso in Gambas:
 
<FONT color=Gray>' ''void exit(int status)''
 
' ''Terminates the calling process immediately. Any open file descriptors belonging to the process are closed.''</font>
 
Private Extern <FONT color=#B22222>exit_C</font>(status As Integer) In "<FONT color=#B22222>libc:6"</font> <FONT color=#B22222>'''Exec "exit"'''</font>
 
 
 
'''Public''' Sub Main()
 
 
  Dim i As Integer
 
 
 
  While True
 
    Print i
 
<FONT color=Gray>' ''Giunta la variabile "i" a 1000, la funzione esterna "exit_C", ossia "exit()", chiude il programma:''</font>
 
    If i = 1000 Then <FONT color=#B22222>exit_C(0)</font>
 
    Inc i
 
  Wend
 
 
'''End'''
 
 
 
 
 
===Ottenere il medesimo effetto della funzione ''exit()'' con l'Assembly===
 
Per ottenere l'uscita dal programma, potremmo utilizzare l'Assembly chiamando la ''syscall'' corrispondente alla funzione 1 dell'interrupt 0x80.
 
 
 
In questo esempio creeremo un'apposita libreria esterna scritta in C, nella quale sarà inserito ''inline'' il necessario codice in linguaggio Assembly:
 
<FONT color=Gray>' ''void asm_C(int i)''
 
' ''Termina un programma liberando tutta la memoria impegnata per esso.''</font>
 
Private Extern asm_C(b As Integer) In "/tmp/Casm"
 
 
 
'''Public''' Sub Main()
 
 
  Dim i As Integer
 
 
  Creaso()
 
 
 
  While True
 
    Inc i
 
    If i = 10000 Then asm_C(0)
 
    Wait 0.001
 
    Print i
 
  Wend
 
 
'''End'''
 
 
 
'''Private''' Procedure Creaso()
 
 
  File.Save("/tmp/Casm.c", "void asm_C(int b) {" &
 
            "\n  int a;" &
 
            "\n\n  __asm__(\"mov $1, %%eax;\"" &
 
            "\n  \"mov $0,%%ebx;\"" &
 
            "\n  \"int $0x80;\"" &
 
            "\n  : \"=a\" (a)" &
 
            "\n  : \"b\" (b)" &
 
            "\n  );\n\n}")
 
 
 
  Shell "gcc -o /tmp/Casm.so /tmp/Casm.c -shared" Wait
 
 
 
'''End'''
 
 
 
 
==Uso della funzione ''_exit()''==
 
La funzione  ''exit()'', precedentemente vista, è contenuta file header ''stdlib.h''. Abbiamo visto che, essendo nel nome analoga alla funzione ''Exit'' di Gambas, siamo costretti a dichiararla con nome differente rispetto alla predetta funzione ''Exit'' di Gambas.
 
 
Possiamo ovviare a questo utilizzando la funzione ''_exit()'', contenuta nel file header ''unistd.h'':
 
void _exit (int __status)
 
Infatti in questo caso potremo dichiarare nel progetto Gambas il suo nome: ''_exit()'' .
 
 
Va precisato che la funzione ''_exit()'', rispetto alla funzione ''exit()'' non chiama la funzione ''fflush()'' per lo svuotamento dei buffer associati all'I/O bufferizzato.
 
 
 
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta.
 
 
<BR>Dunque avremo ad esempio:
 
Private <FONT color=#B22222>Extern _exit</font>(__status As Integer) In "<FONT color=#B22222>libc:6"</font>
 
 
 
Semplice esempio di uso in Gambas:
 
<FONT color=Gray>' ''void _exit(int __status)''
 
' ''Terminate program execution with the low-order 8 bits of STATUS.''</font>
 
Private Extern <FONT color=#B22222>_exit</font>(__status As Integer) In "<FONT color=#B22222>libc:6"</font>
 
 
 
'''Public''' Sub Main()
 
 
  Dim i As Integer
 
 
 
  While True
 
    Print i
 
<FONT color=Gray>' ''Giunta la variabile "i" a 1000, la funzione esterna "_exit" chiude il programma:''</font>
 
    If i = 1000 Then <FONT color=#B22222>_exit(0)</font>
 
    Inc i
 
  Wend
 
 
'''End'''
 

Versione delle 08:38, 1 nov 2016