Differenze tra le versioni di "Ricevere un 'segnale' da un programma C"
Riga 1: | Riga 1: | ||
− | Un applicativo Gambas può ricevere un "''segnale''" da un programma C, generato al verificarsi di un evento ed inviato mediante le specifiche funzioni previste dal linguaggio C. L'intercettazione mediante la funzione " | + | Un applicativo Gambas può ricevere un "''segnale''" da un programma C, generato al verificarsi di un evento ed inviato mediante le specifiche funzioni previste dal linguaggio C. L'intercettazione del segnale mediante la funzione "signal()" da parte di Gambas, inviato dal programma C, può avvenire solo utilizzando un'apposita libreria esterna condivisa .so, che dovrà essere scritta da noi. |
− | |||
====Esempio pratico==== | ====Esempio pratico==== | ||
Nell'esempio che segue, l'applicativo Gambas avvia per cinquanta volte un programma C passandogli anche il numero identificativo del suo processo. L'applicativo Gambas provvede, altrsì, a gestire il processo del programma C mediante apposita variabile di tipo ''Process'', nonché ponendolo in ''osservazione'' con ''For Read''. | Nell'esempio che segue, l'applicativo Gambas avvia per cinquanta volte un programma C passandogli anche il numero identificativo del suo processo. L'applicativo Gambas provvede, altrsì, a gestire il processo del programma C mediante apposita variabile di tipo ''Process'', nonché ponendolo in ''osservazione'' con ''For Read''. | ||
− | Il programma C invia innanzitutto al proprio ''stdout'' un messaggio contenente fra l'altro l'Id ricevuto del processo dell'applicativo Gambas. Successivamente esso invia ogni dieci cicli all'interno di un'iterazione | + | Il programma C invia innanzitutto al proprio ''stdout'' un messaggio contenente fra l'altro l'Id ricevuto del processo dell'applicativo Gambas. Successivamente esso invia ogni dieci cicli all'interno di un'iterazione "For" un segnale all'applicativo Gambas, individuato in base all'Id ricevuto del processo Gambas. |
L'applicativo Gambas a sua volta riceverà tramite l'apposita libreria esterna condivisa .so, il segnale inviato dal programma C, ed intercetterà quanto scritto dal programma C nel proprio ''stdout''. | L'applicativo Gambas a sua volta riceverà tramite l'apposita libreria esterna condivisa .so, il segnale inviato dal programma C, ed intercetterà quanto scritto dal programma C nel proprio ''stdout''. | ||
− | |||
Il programma C in questo esempio sarà il seguente: | Il programma C in questo esempio sarà il seguente: | ||
Riga 34: | Riga 32: | ||
} | } | ||
− | + | Il codice dell'applicativo Gambas, contenente anche il codice per creare l'apposita libreria condivisa .so, da noi realizzata - per ricevere il segnale dal programma C - che chiameremo ad esempio "''libadhoc.c''", sarà il seguente: | |
− | |||
− | Il codice dell'apposita libreria condivisa .so, da noi realizzata per ricevere il segnale dal programma C | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Private pr As Process | Private pr As Process | ||
Riga 68: | Riga 42: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | <FONT color=gray>' ''Va a creare la libreria esterna "libadhoc.so":''</font> | |
+ | Creaso() | ||
− | <FONT color=gray>' ''Invoca la funzione della libreria esterna "libadhoc. | + | <FONT color=gray>' ''Invoca la funzione della libreria esterna "libadhoc.so", per poter ricevere il segnale inviato dal programma C:''</font> |
− | + | Riceve_Segnale() | |
− | |||
− | + | Repeat | |
− | + | Wait 0.5 | |
− | + | Inc i | |
− | + | Print "\n\e[1m"; i; "\e[0m" | |
− | + | pr = Shell "/tmp/programma " & Application.Handle For Read As "Processo" | |
− | + | Until i = 50 | |
'''End''' | '''End''' | ||
− | + | '''Public''' Sub Processo_Read() | |
− | '''Public''' Sub | ||
Dim s As String | Dim s As String | ||
− | + | Line Input #pr, s | |
− | + | Print "\x0AIntercettato invio dati di 'programma.c' allo 'stdout':"; s | |
+ | |||
+ | '''End''' | ||
+ | |||
+ | '''Private''' Procedure Creaso() | ||
+ | |||
+ | File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" & | ||
+ | "#include <signal.h>\n\n" & | ||
+ | "void vai(int);\n\n" & | ||
+ | "void Riceve_Segnale() {\n" & | ||
+ | "/* Se il codice riceve il segnale 'SIGURS1', allora invoca la funzione 'vai' */" & | ||
+ | " signal(SIGUSR1, vai);"\n}\n\n" & | ||
+ | "void vai(int i) {\n" & | ||
+ | " printf(\" - - > La libreria 'libadhoc.so' ha ricevuto segnale da 'programma.c'\\n\");\n}") | ||
+ | |||
+ | Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait | ||
'''End''' | '''End''' |
Versione delle 15:52, 14 dic 2021
Un applicativo Gambas può ricevere un "segnale" da un programma C, generato al verificarsi di un evento ed inviato mediante le specifiche funzioni previste dal linguaggio C. L'intercettazione del segnale mediante la funzione "signal()" da parte di Gambas, inviato dal programma C, può avvenire solo utilizzando un'apposita libreria esterna condivisa .so, che dovrà essere scritta da noi.
Esempio pratico
Nell'esempio che segue, l'applicativo Gambas avvia per cinquanta volte un programma C passandogli anche il numero identificativo del suo processo. L'applicativo Gambas provvede, altrsì, a gestire il processo del programma C mediante apposita variabile di tipo Process, nonché ponendolo in osservazione con For Read.
Il programma C invia innanzitutto al proprio stdout un messaggio contenente fra l'altro l'Id ricevuto del processo dell'applicativo Gambas. Successivamente esso invia ogni dieci cicli all'interno di un'iterazione "For" un segnale all'applicativo Gambas, individuato in base all'Id ricevuto del processo Gambas.
L'applicativo Gambas a sua volta riceverà tramite l'apposita libreria esterna condivisa .so, il segnale inviato dal programma C, ed intercetterà quanto scritto dal programma C nel proprio stdout.
Il programma C in questo esempio sarà il seguente:
#include <sys/types.h> #include <signal.h> #include <stdlib.h> #include <stdio.h> void main(int argc, char **argv) { /* Riceve il PID del programma Gambas */ printf(" \"PID applicativo Gambas = %s\"\n", argv[1]); // Converte il valore stringa di caratteri in Valore numerico intero: int i = atoi(argv[1]); int n; for (n==1; n<=51; n++) { /* kill() - invia un segnale ad un processo individuato dal suo PID contenuto nella variabile "i": */ if ((n%10)==0) kill(i, SIGUSR1); } }
Il codice dell'applicativo Gambas, contenente anche il codice per creare l'apposita libreria condivisa .so, da noi realizzata - per ricevere il segnale dal programma C - che chiameremo ad esempio "libadhoc.c", sarà il seguente:
Private pr As Process Private Extern Riceve_Segnale() In "/tmp/libadhoc" Public Sub Main() Dim i As Integer ' Va a creare la libreria esterna "libadhoc.so": Creaso() ' Invoca la funzione della libreria esterna "libadhoc.so", per poter ricevere il segnale inviato dal programma C: Riceve_Segnale() Repeat Wait 0.5 Inc i Print "\n\e[1m"; i; "\e[0m" pr = Shell "/tmp/programma " & Application.Handle For Read As "Processo" Until i = 50 End Public Sub Processo_Read() Dim s As String Line Input #pr, s Print "\x0AIntercettato invio dati di 'programma.c' allo 'stdout':"; s End Private Procedure Creaso() File.Save("/tmp/libadhoc.c", "#include <stdio.h>\n" & "#include <signal.h>\n\n" & "void vai(int);\n\n" & "void Riceve_Segnale() {\n" & "/* Se il codice riceve il segnale 'SIGURS1', allora invoca la funzione 'vai' */" & " signal(SIGUSR1, vai);"\n}\n\n" & "void vai(int i) {\n" & " printf(\" - - > La libreria 'libadhoc.so' ha ricevuto segnale da 'programma.c'\\n\");\n}") Shell "gcc -o /tmp/libadhoc.so /tmp/libadhoc.c -shared -fPIC" Wait End