Differenze tra le versioni di "Exit ()"
(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 " | + | <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