Differenze tra le versioni di "Signal ()"

Da Gambas-it.org - Wikipedia.
 
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. ''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:
+
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>&#091;[[#Note|Nota 1]]&#093;</sup>
 
Semplice esempio di uso in Gambas congiuntamente con la funzione ''alarm()'': <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
 
  Library "libc:6"
 
  Library "libc:6"
Riga 29: Riga 27:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  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=#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)
+
  alarm(3)
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Function post_alarm(segno As Integer) <FONT color=Gray>' ''"segno" passa il valore del 1° parametro di "signal()"''</font>
+
  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'''
+
  End
 
 
  
  
Riga 68: Riga 65:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  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'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure wait_alarm(isignal As Integer)
+
  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'''
+
  End
 
+
oppure usando la funzione "pause()" della libreria ''unistd.h'':
 
 
oppure usando la funzione ''pause()'' della libreria ''unistd.h'':
 
 
  Library "libc:6"
 
  Library "libc:6"
 
   
 
   
Riga 111: Riga 106:
 
    
 
    
 
   
 
   
  '''Public''' Sub Main()
+
  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>
' ''sino a quando non giungerà il segnale:''</font>
 
 
   pause()
 
   pause()
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure wait_alarm(isignal As Integer)
+
  Private Procedure wait_alarm(isignal As Integer)
 
   
 
   
 
   Print "\nRicevuto il segnale "; isignal; " - Termine programma"
 
   Print "\nRicevuto il segnale "; isignal; " - Termine programma"
 
    
 
    
  '''End'''
+
  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()
+
  Public Sub Main()
 
   
 
   
  signal(SIGALRM, wait_alarm)
+
  signal(SIGALRM, wait_alarm)
 
    
 
    
  alarm(1)
+
  alarm(1)
 
   
 
   
  v = True
+
  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
+
  While v
 
+
    wait 0.01
  Wend
+
  Wend
+
   
  Main()
+
  Main()
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure wait_alarm(isignal As Integer)
+
  Private Procedure wait_alarm(isignal As Integer)
 
   
 
   
  Inc i
+
  Inc i
 
   
 
   
  Print "Secondi trascorsi: "; i
+
  Print "Secondi trascorsi: "; i
 
   
 
   
  v = False
+
  v = False
 
    
 
    
  '''End'''
+
  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()
+
  Public Sub Main()
 
    
 
    
 
   signal(SIGINT, sighandler)
 
   signal(SIGINT, sighandler)
 
    
 
    
   While True
+
   Do
 
     Print "Ciclo con attesa di 1 secondo..."
 
     Print "Ciclo con attesa di 1 secondo..."
     Sleep 1
+
     Wait 1
   Wend
+
   Loop
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure sighandler(signum As Integer)
+
  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'''
+
  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()
+
  Public Sub Main()
 
    
 
    
 
   signal(SIGQUIT, sighandler)
 
   signal(SIGQUIT, sighandler)
Riga 232: Riga 220:
 
   End With
 
   End With
 
      
 
      
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure sighandler(signum As Integer)
+
  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'''
+
  End
 
   
 
   
  '''Public''' Sub Tempus_Timer()
+
  Public Sub Tempus_Timer()
 
    
 
    
 
   Print "Ciclo con attesa di 1 secondo..."
 
   Print "Ciclo con attesa di 1 secondo..."
 
    
 
    
  '''End'''
+
  End
  
  
  
 
=Note=
 
=Note=
[1] Vedi anche la pagina relativa alla ''[[Alarm_()|funzione alarm()]]''
+
[1] Vedi anche la pagina relativa alla "[[Alarm_()|funzione alarm()]]".

Versione attuale delle 15: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()".