Exit () - exit (): differenze tra le versioni
(Creata pagina con "La funzione della libreria di C: void exit(int status) , contenuta nella libreria ''stdlib.h'', termina il programma. I buffer dei file vengono svuotati, i flussi sono chiusi...") |
Nessun oggetto della modifica |
||
| Riga 76: | Riga 76: | ||
==Uso della funzione ''_exit()''== | ==Uso della funzione ''_exit()''== | ||
La funzione | La funzione della libreria ''unistd.h'': | ||
void _exit (int __status) | |||
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. | 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. | ||
| Riga 109: | Riga 107: | ||
'''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( )''. | |||
=Riferimenti= | |||
* https://linux.die.net/man/3/exit | |||
* https://linux.die.net/man/3/_exit | |||
* http://man7.org/linux/man-pages/man2/_exit.2.html | |||
* http://www.science.unitn.it/~fiorella/guidac/guidac098.html | |||
* http://digilander.libero.it/uzappi/C/librerie/funzioni/exit.html | |||
* http://digilander.libero.it/uzappi/C/librerie/funzioni/_exit.html | |||
Versione delle 09:50, 1 nov 2016
La funzione della libreria di C:
void exit(int status)
, contenuta nella libreria stdlib.h, 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 della libreria unistd.h:
void _exit (int __status)
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
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
- https://linux.die.net/man/3/exit
- https://linux.die.net/man/3/_exit
- http://man7.org/linux/man-pages/man2/_exit.2.html
- http://www.science.unitn.it/~fiorella/guidac/guidac098.html
- http://digilander.libero.it/uzappi/C/librerie/funzioni/exit.html
- http://digilander.libero.it/uzappi/C/librerie/funzioni/_exit.html