Differenze tra le versioni di "Intercettare dati inviati al programma dal sistema o da altri programmi utilizzati"

Da Gambas-it.org - Wikipedia.
Riga 12: Riga 12:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
   pr = Shell "cat < /proc/<FONT color=#B22222>num_processo</font>/fd/1" For Read As "pr"
+
   pr = Shell "cat < /proc/<FONT color=#B22222>numero_del_processo</font>/fd/1" For Read As "pr"
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 19:55, 23 dic 2013

Casi in cui l'applicativo riceve dati non previsti e non richiesti

In taluni casi il sistema (ad esempio quando si tenta di accedere ad un file protetto; etc.) o applicazioni non-Gambas presenti nel sistema e comunque utilizzate dall'applicativo Gambas possono inviare, ancorché non richiesto espressamente dal codice dell'applicativo, dei messaggi e degli avvisi all'applicativo medesimo .
Il programma Gambas può intercettare tali dati in tempo reale |1|. Si dovrà individuare preliminarmente il numero ID del processo del programma Gambas, e si andrà a gestire in lettura il suo file descriptor num. 1, dal quale si leggerà con il comando bash: cat. Bisogna sottolineare che per poter leggere il file descriptor n. 1 associato al processo del programma è necessario cambiare i suoi permessi.

Il programma che riceve i dati dal sistema è capace di intercettarli dalla propria console solo se è un eseguibile. Qualora si stia facendo un test con un progetto Gambas, non è possibile con il codice far intercettare all'applicativo-progetto i dati che riceve dal sistema. In questo secondo caso si dovrà utilizzare un secondo programma Gambas che vada a leggere il file descriptor n. 1 del processo del programma-progetto principale Gambas.


L'applicativo Gambas avrà, dunque, codice di questo tenore:

Private pr As Process


Public Sub Form_Open()

  pr = Shell "cat < /proc/numero_del_processo/fd/1" For Read As "pr"

End


Public Sub pr_Read()

 Dim s As String

  Line Input #pr, s

    TextArea1.Text = s

End


Riprendendo questo codice, facciamo un esempio pratico:

Private pr As Process


Public Sub Form_Open()

   pr = Shell "cat < /proc" &/ CStr(Application.Id) &/ "fd/1" For Read As "pr"
 
End


Public Sub pr_Read()

   TextArea1.Text &= pr.ReadLine() & Chr(10)

End


Public Sub Button1_Click()

' Per l'esperimento inserire questo file-device o comunque altro file "protetto":
   Shell "cat > /dev/ttyS2"

End


Casi in cui l'applicativo Gambas riceve dati nella console da programmi lanciati con Exec o Shell

Nei casi in cui l'applicativo Gambas riceve dati nella propria console da programmi che nel suo codice sono stati lanciati con Exec o Shell. Tali dati potranno essere intercettati anche se l'applicativo Gambas è avviato a livello di IDE come semplice progetto.


Nell'esempio che segue, i dati intercettati nella console, proveniente da un programma esterno lanciato con Exec e di cui viene gestito il processo mediante una variabile di tipo Process, vengono poi trasferiti direttamente in una TextArea posta sul Form dell'applicativo Gambas:

Private pr As Process


Public Sub Form_Open()

  pr = Exec ["/percorso/del/programma/di/cui/si/riceveranno/i/dati/in/console"] For Input As "prova"   ' Può essere usato anche il comando "Shell"

End


Public Sub prova_Read()

  TextArea1.Text &= pr.ReadLine() & "\n"

End