Newsgroup: it.comp.lang.perl
Titolo: Comunicazione tra Cgi e processo Perl

Salve ragazzi!
Io dovrei implementare un'applicazione perl, che chiamerò "programmone" che, 
eseguendo un ciclo infinito, controlla periodicamente delle cose sulla mia 
macchina. Essendo questa macchina un server, volevo controllare questo 
processo perl tramite un cgi sempre in  perl che chiedendomi username e 
password mi permettesse di cambiare dei parametri sul processo principale..
In sintesi dovrei far comunicare lo script cgi in perl con un processo perl 
che è in un loop infinito.
Avevo 2 idee:
-Sincronizzazione su un file di testo, cioè appena il "programmone" vedeva 
che il file non era vuoto allora lo script cgi gli ci aveva messo qualcosa, 
quindi lo legge e lo riazzera.
-Scrivere su una struttura dati in memoria condivisa. La cosa che 
preferirei, così da scrivere subito i dati in memoria "ordinati" per il 
"programmone"
Che mi consigliate?
Grazie tante! 

Giojo ha scritto:

CGI in perl? e anche programmone?
Si puo' fare qualunque cosa: Named pipe, Socket in dominio UNIX o INET,
memoria condivisa + semaforo, file + flock() ...
ma la cosa piu' interessante e' come deve avvenire questa interazione,
se in modo sincrono o asincrono.
se programmone vuole essere aggiornato nel suo environment o rende
disponibili info SOLO quando si trova in certo stato interno, si
opta per un metodo sincrono:
programmone: "E' ora di controllare se qualcuno ha degli ordini per me"
1) apro un file ben noto
2) pongo un lock() esclusivo
3) leggo  la prima linea del file e da qui capisco se e' una nuova
   versione. Se si', aggiorno il record interno al contenuto del
   resto del file e tengo nota del nuovo numero di versione
   (si puo' anche solo verificare se file e' vuoto o no come dici tu)
4) tolgo il lock
5) chiudo il file e compio un ciclo prima di tornare al punto 1)
CGI: "ho delle novita' per programmone"
1) apro un file ben noto
2) pongo un lock() esclusivo
3) quando lo ottengo sovrascrivo il contenuto
   (se il nuovo e' piu' corto chiamo truncate())
4) tolgo lock, chiudo il file e tolgo il disturbo.
Il centro di tutto e' la funzione flock() con flag LOCK_EX
se programmone otterra' per primo il lock non vedra' la modifica del
file prima del ciclo successivo (ma ti potrebbe andare bene), se la CGI
ottiene il lock() aggionera' il file prima che programmone lo legga.
Stesso scenario con memoria condivisa e semaforo.
Se invece programmone deve essere piu' reattivo e si vuole evitare il
costo di leggere migliaia di volte la prima linea del file potrebbe
non leggere mai il file se non sollegitato con un signal SIGUSR1 o 
altro (mandatogli dalla CGI che dovrebbe accedere ad un file ben noto
per sapere il PID di programmone).
Il tal caso, in modo asincrono e indipendente dal suo stato
interno, l' handler deputato ricarichera' il file.
In questo caso usiamo kill del perl nella CGI.
Ciao.
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio 
news:cpl8es$erp$1...@news.newsland.it...


 Grazie tante! Hai scritto molta roba utile...
Prego. E' un po' che faccio il nottambulo, con moglie e bambino in
vacanza sto' come un PAPA e trovo parecchio tempo, ma finira' presto...
