Differenze tra le versioni di "Signal ()"
(Una versione intermedia di uno stesso utente non è mostrata) | |||
Riga 1: | Riga 1: | ||
− | La funzione | + | La funzione |
− | void (*signal(int signum, void (*sighandler)(int)))(int) | + | void (*signal(int signum, void (*sighandler)(int)))(int) |
− | gestisce i segnali che riguardano il programma, chiamando una funzione particolare in presenza di un determinato segnale. | + | gestisce i segnali che riguardano il programma, chiamando una funzione particolare in presenza di un determinato segnale. "Signal()", dunque, associa un determinato segnale, indicato dal parametro ''signum'', alla chiamata della funzione ''sighandler''. Questo secondo parametro è più specificatamente un ''Puntatore'' a funzione (se ne dovrà tenere conto poi usando tale funzione nel codice Gambas), e può essere impostato in uno dei tre seguenti modi: |
* SIG_DFL : viene eseguita dal processo l'azione prevista dal segnale indicato nel primo parametro; | * SIG_DFL : viene eseguita dal processo l'azione prevista dal segnale indicato nel primo parametro; | ||
* SIG_IGN : il segnale (fatta eccezione per SIGKILL e SIGSTOP), indicato nel primo parametro, è ignorato; | * SIG_IGN : il segnale (fatta eccezione per SIGKILL e SIGSTOP), indicato nel primo parametro, è ignorato; | ||
Riga 9: | Riga 9: | ||
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: | ||
Private <FONT color=#B22222>Extern signal</font>(signum As Integer, sighandler As Pointer) As Integer In "<FONT color=#B22222>libc:6</font>" | Private <FONT color=#B22222>Extern signal</font>(signum As Integer, sighandler As Pointer) As Integer In "<FONT color=#B22222>libc:6</font>" | ||
− | |||
− | |||
Semplice esempio di uso in Gambas congiuntamente con la funzione ''alarm()'': <SUP>[[[#Note|Nota 1]]]</sup> | Semplice esempio di uso in Gambas congiuntamente con la funzione ''alarm()'': <SUP>[[[#Note|Nota 1]]]</sup> | ||
Library "libc:6" | Library "libc:6" | ||
Riga 29: | Riga 27: | ||
− | + | Public Sub Form_Open() | |
<FONT color=Gray>' ''Gestione del segnale SIGALRM:''</font> | <FONT color=Gray>' ''Gestione del segnale SIGALRM:''</font> | ||
− | + | <FONT color=#B22222>signal(SIGALRM, post_alarm)</font> | |
<FONT color=Gray>' ''Attivazione del segnale di allarme dopo 3 secondi:''</font> | <FONT color=Gray>' ''Attivazione del segnale di allarme dopo 3 secondi:''</font> | ||
− | + | alarm(3) | |
− | + | End | |
− | + | Private Function post_alarm(segno As Integer) <FONT color=Gray>' ''"segno" passa il valore del 1° parametro di "signal()"''</font> | |
Print "\nRicevuto il segnale "; segno; " - Termine del programma" | Print "\nRicevuto il segnale "; segno; " - Termine del programma" | ||
Riga 46: | Riga 44: | ||
exit_C(0) | exit_C(0) | ||
− | + | End | |
− | |||
Riga 68: | Riga 65: | ||
− | + | Public Sub Main() | |
signal(SIGALRM, wait_alarm) <FONT color=Gray>' ''gestione del segnale SIGALRM''</font> | signal(SIGALRM, wait_alarm) <FONT color=Gray>' ''gestione del segnale SIGALRM''</font> | ||
Riga 80: | Riga 77: | ||
Wend | Wend | ||
− | + | End | |
− | + | Private Procedure wait_alarm(isignal As Integer) | |
Print "\nRicevuto il segnale "; isignal; " - Termine programma" | Print "\nRicevuto il segnale "; isignal; " - Termine programma" | ||
Riga 90: | Riga 87: | ||
bo = False | bo = False | ||
− | + | End | |
− | + | oppure usando la funzione "pause()" della libreria ''unistd.h'': | |
− | |||
− | oppure usando la funzione | ||
Library "libc:6" | Library "libc:6" | ||
Riga 111: | Riga 106: | ||
− | + | Public Sub Main() | |
signal(SIGALRM, wait_alarm) <FONT color=Gray>' ''gestione del segnale SIGALRM''</font> | signal(SIGALRM, wait_alarm) <FONT color=Gray>' ''gestione del segnale SIGALRM''</font> | ||
Riga 118: | Riga 113: | ||
alarm(4) | alarm(4) | ||
− | <FONT color=Gray>' ''Invochiamo la funzione esterna "pause()" che sospenderà il processo | + | <FONT color=Gray>' ''Invochiamo la funzione esterna "pause()" che sospenderà il processo sino a quando non giungerà il segnale:''</font> |
− | |||
pause() | pause() | ||
− | + | End | |
− | + | Private Procedure wait_alarm(isignal As Integer) | |
Print "\nRicevuto il segnale "; isignal; " - Termine programma" | Print "\nRicevuto il segnale "; isignal; " - Termine programma" | ||
− | + | End | |
− | |||
− | |||
Si può scrivere un codice per creare un ciclo temporizzato, come se si usasse la Classe ''Timer'' di Gambas: | Si può scrivere un codice per creare un ciclo temporizzato, come se si usasse la Classe ''Timer'' di Gambas: | ||
Private v As Boolean | Private v As Boolean | ||
Riga 150: | Riga 142: | ||
− | + | Public Sub Main() | |
− | + | signal(SIGALRM, wait_alarm) | |
− | + | alarm(1) | |
− | + | v = True | |
<FONT color=Gray>' ''Attiviamo il ciclo per impedire che il processo giunga subito al termine:''</font> | <FONT color=Gray>' ''Attiviamo il ciclo per impedire che il processo giunga subito al termine:''</font> | ||
− | + | While v | |
− | + | wait 0.01 | |
− | + | Wend | |
− | + | ||
− | + | Main() | |
− | + | End | |
− | + | Private Procedure wait_alarm(isignal As Integer) | |
− | + | Inc i | |
− | + | Print "Secondi trascorsi: "; i | |
− | + | v = False | |
− | + | End | |
− | |||
− | |||
In quest'altro esempio si provocherà la chiusura del programma, quando si premeranno i tasti Ctrl+C: | In quest'altro esempio si provocherà la chiusura del programma, quando si premeranno i tasti Ctrl+C: | ||
Library "libc:6" | Library "libc:6" | ||
Riga 189: | Riga 179: | ||
− | + | Public Sub Main() | |
signal(SIGINT, sighandler) | signal(SIGINT, sighandler) | ||
− | + | Do | |
Print "Ciclo con attesa di 1 secondo..." | Print "Ciclo con attesa di 1 secondo..." | ||
− | + | Wait 1 | |
− | + | Loop | |
− | + | End | |
− | + | Private Procedure sighandler(signum As Integer) | |
Print "Raccolto il segnale: "; signum; " - Termine del programma." | Print "Raccolto il segnale: "; signum; " - Termine del programma." | ||
Riga 207: | Riga 197: | ||
Quit | Quit | ||
− | + | End | |
− | |||
− | |||
In quest'altro esempio, nel quale verrà utilizzata la Classe "''Timer''" anziché un ciclo, si provocherà la chiusura del programma, quando si premeranno i tasti Ctrl+\ : | In quest'altro esempio, nel quale verrà utilizzata la Classe "''Timer''" anziché un ciclo, si provocherà la chiusura del programma, quando si premeranno i tasti Ctrl+\ : | ||
Private tm As Timer | Private tm As Timer | ||
Riga 223: | Riga 211: | ||
− | + | Public Sub Main() | |
signal(SIGQUIT, sighandler) | signal(SIGQUIT, sighandler) | ||
Riga 232: | Riga 220: | ||
End With | End With | ||
− | + | End | |
− | + | Private Procedure sighandler(signum As Integer) | |
Print "Raccolto il segnale: "; signum; " - Termine del programma." | Print "Raccolto il segnale: "; signum; " - Termine del programma." | ||
Riga 241: | Riga 229: | ||
Quit | Quit | ||
− | + | End | |
− | + | Public Sub Tempus_Timer() | |
Print "Ciclo con attesa di 1 secondo..." | Print "Ciclo con attesa di 1 secondo..." | ||
− | + | End | |
=Note= | =Note= | ||
− | [1] Vedi anche la pagina relativa alla | + | [1] Vedi anche la pagina relativa alla "[[Alarm_()|funzione alarm()]]". |
Versione attuale delle 14:39, 16 giu 2024
La funzione
void (*signal(int signum, void (*sighandler)(int)))(int)
gestisce i segnali che riguardano il programma, chiamando una funzione particolare in presenza di un determinato segnale. "Signal()", dunque, associa un determinato segnale, indicato dal parametro signum, alla chiamata della funzione sighandler. Questo secondo parametro è più specificatamente un Puntatore a funzione (se ne dovrà tenere conto poi usando tale funzione nel codice Gambas), e può essere impostato in uno dei tre seguenti modi:
- SIG_DFL : viene eseguita dal processo l'azione prevista dal segnale indicato nel primo parametro;
- SIG_IGN : il segnale (fatta eccezione per SIGKILL e SIGSTOP), indicato nel primo parametro, è ignorato;
- una Funzione, stabilita dall'utente ed avente un parametro di tipo Intero, che sarà attivata dal segnale indicato nel primo parametro. Il valore di questo parametro sarà anche passato al parametro di tipo Intero della Funzione chiamata.
Volendola utilizzare in Gambas, bisognerà dichiararla con Extern, nonché dichiarare la libreria di C: libc.so.6, nella quale la funzione è contenuta:
Private Extern signal(signum As Integer, sighandler As Pointer) As Integer In "libc:6"
Semplice esempio di uso in Gambas congiuntamente con la funzione alarm(): [Nota 1]
Library "libc:6" Private Const SIGALRM As Integer = 14 ' void (*signal(int signum, void (*sighandler)(int)))(int) ' Sets a function to handle signal i.e. a signal handler with signal number sig. Private Extern signal(signum As Integer, sighandler As Pointer) As Integer ' unsigned int alarm(unsigned int seconds) ' Schedule an alarm. Private Extern alarm(seconds As Integer) As Integer ' void exit (int __status) ' Terminate program execution with STATUS. Private Extern exit_C(status As Integer) Exec "exit" Public Sub Form_Open() ' Gestione del segnale SIGALRM: signal(SIGALRM, post_alarm) ' Attivazione del segnale di allarme dopo 3 secondi: alarm(3) End Private Function post_alarm(segno As Integer) ' "segno" passa il valore del 1° parametro di "signal()" Print "\nRicevuto il segnale "; segno; " - Termine del programma" exit_C(0) End
Esempio con applicazione a riga di comando
Lo stesso esempio può essere fatto con un'applicazione a riga di comando. In questo caso, però, deve essere utilizzato un ciclo nella procedura principale, dal quale si uscirà solo quando si attiverà la funione alarm():
Private bo As Boolean = True Library "libc:6" Private Const SIGALRM As Integer = 14 ' void (*signal(int signum, void (*sighandler)(int)))(int) ' Set the handler for the signal SIG to HANDLER. Private Extern signal(signum As Integer, wait_alarm As Pointer) ' unsigned int alarm(unsigned int seconds) ' Schedule an alarm. Private Extern alarm(seconds As Integer) As Integer Public Sub Main() signal(SIGALRM, wait_alarm) ' gestione del segnale SIGALRM ' Il segnale di allarme scatterà dopo 4 secondi: alarm(4) ' Attiviamo il ciclo per impedire che il processo giunga subito al termine: While bo Sleep 0.01 Wend End Private Procedure wait_alarm(isignal As Integer) Print "\nRicevuto il segnale "; isignal; " - Termine programma" ' Per terminare il programma, assegnamo il valore "False" alla variabile booleana "bo": bo = False End
oppure usando la funzione "pause()" della libreria unistd.h:
Library "libc:6" Private Const SIGALRM As Integer = 14 ' void (*signal(int signum, void (*sighandler)(int)))(int) ' Set the handler for the signal SIG to HANDLER. Private Extern signal(signum As Integer, wait_alarm As Pointer) ' unsigned int alarm(unsigned int seconds) ' Schedule an alarm. Private Extern alarm(seconds As Integer) As Integer ' int pause (void) ' Suspend the process until a signal arrives. Private Extern pause() As Integer Public Sub Main() signal(SIGALRM, wait_alarm) ' gestione del segnale SIGALRM ' Il segnale di allarme scatterà dopo 4 secondi: alarm(4) ' Invochiamo la funzione esterna "pause()" che sospenderà il processo sino a quando non giungerà il segnale: pause() End Private Procedure wait_alarm(isignal As Integer) Print "\nRicevuto il segnale "; isignal; " - Termine programma" End
Si può scrivere un codice per creare un ciclo temporizzato, come se si usasse la Classe Timer di Gambas:
Private v As Boolean Private i As Integer Library "libc:6" Private Const SIGALRM As Integer = 14 ' void (*signal(int signum, void (*sighandler)(int)))(int) ' Set the handler for the signal SIG to HANDLER. Private Extern signal(signum As Integer, wait_alarm As Pointer) ' unsigned int alarm(unsigned int seconds) ' Schedule an alarm. Private Extern alarm(seconds As Integer) As Integer Public Sub Main() signal(SIGALRM, wait_alarm) alarm(1) v = True ' Attiviamo il ciclo per impedire che il processo giunga subito al termine: While v wait 0.01 Wend Main() End Private Procedure wait_alarm(isignal As Integer) Inc i Print "Secondi trascorsi: "; i v = False End
In quest'altro esempio si provocherà la chiusura del programma, quando si premeranno i tasti Ctrl+C:
Library "libc:6" Private Const SIGINT As Integer = 2 ' __sighandler_t signal (int __sig, __sighandler_t __handler) ' Set the handler for the signal SIG to HANDLER. Private Extern signal(__sig As Integer, __handler As Pointer) As Integer Public Sub Main() signal(SIGINT, sighandler) Do Print "Ciclo con attesa di 1 secondo..." Wait 1 Loop End Private Procedure sighandler(signum As Integer) Print "Raccolto il segnale: "; signum; " - Termine del programma." Quit End
In quest'altro esempio, nel quale verrà utilizzata la Classe "Timer" anziché un ciclo, si provocherà la chiusura del programma, quando si premeranno i tasti Ctrl+\ :
Private tm As Timer Library "libc:6" Private Const SIGQUIT As Integer = 3 ' __sighandler_t signal (int __sig, __sighandler_t __handler) ' Set the handler for the signal SIG to HANDLER. Private Extern signal(__sig As Integer, __handler As Pointer) As Integer Public Sub Main() signal(SIGQUIT, sighandler) With tm = New Timer As "Tempus" .Delay = 1000 .Start End With End Private Procedure sighandler(signum As Integer) Print "Raccolto il segnale: "; signum; " - Termine del programma." tm.Stop Quit End Public Sub Tempus_Timer() Print "Ciclo con attesa di 1 secondo..." End
Note
[1] Vedi anche la pagina relativa alla "funzione alarm()".