|
|
(2 versioni intermedie di uno stesso utente non sono mostrate) |
Riga 1: |
Riga 1: |
− | La funzione della libreria di C
| + | #REDIRECT [[Exit_()_-_exit_()|Exit() _exit()]] |
− | 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'''
| |