Differenze tra le versioni di "Exit () - exit ()"

Da Gambas-it.org - Wikipedia.
 
Riga 1: Riga 1:
=Uso della funzione ''exit( )''=
+
=Uso della funzione "exit()"=
 
La funzione, dichiarata nel file header "''/usr/include/stdlib.h''":
 
La funzione, dichiarata nel file header "''/usr/include/stdlib.h''":
 
  void exit(int status)
 
  void exit(int status)
termina il programma. I buffer dei file vengono svuotati, i flussi sono chiusi, ed i file temporanei vengono eliminati. In sostanza la funzione esterna "''exit( )''" termina l'intero processo, senza tenere in debita considerazione dei rilasci di risorse (deallocazione di memoria, chiusura di connessioni internet, etc.). Dovrebbe essere usato solo per particolarissimi casi di necessità, come ad esempio per  ''out of memory'', per spazio disco terminato o per gravi errori hardware.
+
termina il programma. I buffer dei file vengono svuotati, i flussi sono chiusi, ed i file temporanei vengono eliminati. In sostanza la funzione esterna "exit()" termina l'intero processo, senza tenere in debita considerazione dei rilasci di risorse (deallocazione di memoria, chiusura di connessioni internet, etc.). Dovrebbe essere usato solo per particolarissimi casi di necessità, come ad esempio per  ''out of memory'', per spazio disco terminato o per gravi errori hardware.
  
 
+
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''.
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>Il parametro della funzione sarà posto a zero.
 
<BR>Dunque avremo ad esempio:
 
<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>
 
  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:
 
Semplice esempio di uso in Gambas:
Riga 21: Riga 19:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  While True
+
  Do
    Print i
+
    Print i
 
  <FONT color=Gray>' ''Giunta la variabile "i" a 1000, la funzione esterna "exit_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
  Wend
+
  Loop
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
  
  
 
===Ottenere il medesimo effetto della funzione ''exit()'' con l'Assembly===
 
===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.
 
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:
 
In questo esempio creeremo un'apposita libreria esterna scritta in C, nella quale sarà inserito ''inline'' il necessario codice in linguaggio Assembly:
Riga 47: Riga 42:
 
   Dim i As Integer
 
   Dim i As Integer
 
   
 
   
  Creaso()
+
  Creaso()
 
    
 
    
  While True
+
  Do
    Inc i
+
    Inc i
    If i = 10000 Then asm_C(0)
+
    If i = 10000 Then asm_C(0)
    Wait 0.001
+
    Wait 0.001
    Print i
+
    Print i
  Wend
+
  Loop
 
   
 
   
 
  '''End'''
 
  '''End'''
 
   
 
   
 +
'''Private''' Procedure Creaso()
 
   
 
   
'''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}")
 
   
 
   
  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
 
   Shell "gcc -o /tmp/Casm.so /tmp/Casm.c -shared" Wait
 
+
 
  '''End'''
 
  '''End'''
  
  
 
+
=Uso della funzione "_exit()"=
=Uso della funzione ''_exit( )''=
+
La funzione, dichiarata nel file header ''/usr/include/unistd.h'':
La funzione, dichiarata nel file header "''/usr/include/unistd.h''":
 
 
  void _exit (int __status)
 
  void _exit (int __status)
rispetto alla funzione ''exit()'' non chiama la funzione ''fflush()'' per lo svuotamento dei buffer associati all'I/O bufferizzato.
+
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.
 
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta.
Riga 86: Riga 77:
 
Dunque avremo ad esempio:
 
Dunque avremo ad esempio:
 
  Private <FONT color=#B22222>Extern _exit</font>(__status As Integer) In "<FONT color=#B22222>libc:6"</font>
 
  Private <FONT color=#B22222>Extern _exit</font>(__status As Integer) In "<FONT color=#B22222>libc:6"</font>
 
  
 
Semplice esempio di uso in Gambas:
 
Semplice esempio di uso in Gambas:
Riga 98: Riga 88:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  While True
+
  Do
    Print i
+
    Print i
 
  <FONT color=Gray>' ''Giunta la variabile "i" a 1000, la funzione esterna "_exit" chiude il programma:''</font>
 
  <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>
+
    If i = 1000 Then <FONT color=#B22222>_exit(0)</font>
    Inc i
+
    Inc i
  Wend
+
  Loop
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
Si dovrebbe usare la funzione "_exit()" per interrompere il programma ''Figlio'', quando la funzione ''exec'' fallisce, perché in questa situazione, il processo ''Figlio'' può interferire con i dati esterni (file) del processo ''Padre''.
 +
<BR>Per lo stesso motivo, si dovrebbe anche usare "_exit()" in qualsiasi processo figlio che non fa un exec, ma quelli sono rari.
  
 
+
In tutti gli altri casi, basta usare la funzione "exit()".
Si dovrebbe usare la funzione ''_exit( )'' per interrompere il programma ''Figlio'', quando la funzione ''exec'' fallisce, perché in questa situazione, il processo ''Figlio'' può interferire con i dati esterni (file) del processo ''Padre''.
 
<BR>Per lo stesso motivo, si dovrebbe anche usare ''_exit( )'' in qualsiasi processo figlio che non fa un exec, ma quelli sono rari.
 
 
 
In tutti gli altri casi, basta usare la funzione ''exit( )''.
 
 
 
  
  

Versione attuale delle 18:15, 20 ott 2022

Uso della funzione "exit()"

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

void exit(int status)

termina il programma. I buffer dei file vengono svuotati, i flussi sono chiusi, ed i file temporanei vengono eliminati. In sostanza la funzione esterna "exit()" termina l'intero processo, senza tenere in debita considerazione dei rilasci di risorse (deallocazione di memoria, chiusura di connessioni internet, etc.). Dovrebbe essere usato solo per particolarissimi casi di necessità, come ad esempio per out of memory, per spazio disco terminato o per gravi errori hardware.

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
 
 Do
   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
 Loop

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()
 
 Do
   Inc i
   If i = 10000 Then asm_C(0)
   Wait 0.001
   Print i
 Loop

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, dichiarata nel file header /usr/include/unistd.h:

void _exit (int __status)

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
 
 Do
   Print i
' Giunta la variabile "i" a 1000, la funzione esterna "_exit" chiude il programma:
   If i = 1000 Then _exit(0)
   Inc i
 Loop

End

Si dovrebbe usare la funzione "_exit()" per interrompere il programma Figlio, quando la funzione exec fallisce, perché in questa situazione, il processo Figlio può interferire con i dati esterni (file) del processo Padre.
Per lo stesso motivo, si dovrebbe anche usare "_exit()" in qualsiasi processo figlio che non fa un exec, ma quelli sono rari.

In tutti gli altri casi, basta usare la funzione "exit()".


Riferimenti