Differenze tra le versioni di "Exit ()"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "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....")
 
Riga 22: Riga 22:
 
   While True
 
   While True
 
     Print i
 
     Print i
  <FONT color=Gray>' ''Giunta la variabile "i" a 1000, la funzione esterna "C_exit" di C, ossia "exit()", chiude il programma:''</font>
+
  <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>
 
     If i = 1000 Then <FONT color=#B22222>exit_C(0)</font>
 
     Inc i
 
     Inc i
Riga 71: Riga 71:
 
   Shell "gcc -o /tmp/Casm.so /tmp/Casm.c -shared" Wait
 
   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'''
 
  '''End'''

Versione delle 18:03, 25 giu 2016

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" è omonima alla funzione di Gambas "Exit", bisognerà assegnarle un nome a piacere, ma si dovrà anche richiamare il suo vero nome con il comando Exec.
Il parametro della funzione sarà posto a zero.
Dunque avremo ad esempio:

Private Extern exit_C(status As Integer) In "libc:6" Exec "exit"


Semplice esempio di uso in Gambas:

' void exit(int status)
' Terminates the calling process immediately. Any open file descriptors belonging to the process are closed.
Private Extern exit_C(status As Integer) In "libc:6" Exec "exit"


Public Sub Main()

 Dim i As Integer
 
  While True
    Print i
' Giunta la variabile "i" a 1000, la funzione esterna "exit_C", ossia "exit()", chiude il programma:
    If i = 1000 Then exit_C(0)
    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:

' void asm_C(int i)
' Termina un programma liberando tutta la memoria impegnata per esso.
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.


Dunque avremo ad esempio:

Private Extern _exit(__status As Integer) In "libc:6"


Semplice esempio di uso in Gambas:

' void _exit(int __status)
' Terminate program execution with the low-order 8 bits of STATUS.
Private Extern _exit(__status As Integer) In "libc:6"


Public Sub Main()

 Dim i As Integer
 
  While True
    Print i
' Giunta la variabile "i" a 1000, la funzione esterna "_exit" chiude il programma:
    If i = 1000 Then _exit(0)
    Inc i
  Wend

End