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

Da Gambas-it.org - Wikipedia.
 
(14 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
==Casi in cui l'applicativo riceve dati non previsti e non richiesti==
+
#REDIRECT [[Intercettare_i_dati_inviati_allo_standard_output_da_un_programma_C]]
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 .
 
<BR>Il programma Gambas può intercettare tali dati in tempo reale |[[#Note|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.
 
 
 
<SPAN style="text-decoration:underline">Il programma che riceve i dati dal sistema è capace di intercettarli dalla propria console solo se è un eseguibile</span>. 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/<FONT color=#B22222>num_processo</font>/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()
 
 
  Dim s As String
 
 
    s = InputBox("Immetti il numero di processo (PID) di questo programma Gambas:")
 
 
    pr = Shell "cat < /proc" &/ s &/ "fd/1" For Read As "pr"
 
 
 
'''End'''
 
 
 
'''Public''' Sub pr_Read()
 
 
  Dim s As String
 
 
  Line Input #pr, s
 
 
    TextArea1.Text = s
 
 
'''End'''
 
 
 
'''Public''' Sub Button1_Click()
 
 
<FONT color=gray>' ''Per l'esperimento inserire questo file-device o comunque altro file "protetto":</font>
 
  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"  <FONT color=gray>' ''Può essere usato anche il comando "Shell"''</font>
 
 
'''End'''
 
 
 
'''Public''' Sub prova_Read()
 
 
  TextArea1.Text &= pr.ReadLine() & "\n"
 
 
'''End'''
 

Versione attuale delle 15:49, 23 mar 2021