|
|
(10 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>numero_del_processo</font>/fd/1" For Read As "pr"
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub pr_Read()
| |
− |
| |
− | TextArea1.Text &= pr.ReadLine() & Chr(10)
| |
− |
| |
− | '''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()
| |
− |
| |
− | <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.
| |
− | | |
− | Da sottolineare che in questo caso il processo deve essere lanciato in lettura usando, però, le parole ''For Input'' (e NON ''For Read'' !).
| |
− | | |
− | | |
− | 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''"] <FONT color=#B22222>For Input</font> As "prova" <FONT color=gray>' ''Può essere usato anche il comando "Shell"''</font>
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub prova_Read()
| |
− |
| |
− | TextArea1.Text &= pr.ReadLine() & "\n"
| |
− |
| |
− | '''End'''
| |
− | | |
− | ====Esempio pratico====
| |
− | Un esempio pratico del precedente codice può essere il seguente.
| |
− | <BR>Creiamo un semplicissimo applicativo in linguaggio C che scriva ogni secondo nello standard output un valore decimale intero crescente:
| |
− | #include <stdio.h>
| |
− |
| |
− |
| |
− | int a;
| |
− |
| |
− | void main() {
| |
− |
| |
− | while (1) {
| |
− |
| |
− | printf("%d\n", a);
| |
− | sleep(1);
| |
− | a++;
| |
− |
| |
− | };
| |
− |
| |
− | }
| |
− | Creiamo, poi, un applicativo Gambas che provvede a lanciare dall'IDE quel codice C gestendone contemporaneamente il processo mediante una variabile di tipo ''Process''.
| |
− | <BR>Ebbene, vedremo che nella console dell'IDE di Gambas verranno scritti i valori sempre crescenti, scritti dall'applicativo in C nello standard output. L'intento, però, è quello di intercettare ''in tempo reale'' tali dati e trasferirli, mostrandoli, in una ''TextArea'' posta sul ''Form'' del progetto Gambas:
| |
− | '''Private''' pr As Process
| |
− |
| |
− |
| |
− | '''Public''' Sub Form_Open()
| |
− |
| |
− | pr = Shell "''/percorso/dell'applicativo/in/C''" <FONT color=#B22222>For Input</font> As "prova"
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub prova_Read()
| |
− |
| |
− | TextArea1.Text = pr.ReadLine()
| |
− |
| |
− | '''End'''
| |