posta - Amiga Magazine Online

posta - Amiga Magazine Online posta - Amiga Magazine Online

amigamagazine.info
from amigamagazine.info More from this publisher
16.06.2013 Views

I I extern struct Library *DOSBase; struct NotifyRequest nr; struct MsgPort *mp; struct NotifyMessage *nm; main (long argc, char **argv) t if (argc!=2) return 10; mp=CreateMsgPort ( ) ; /* funzione del 2.0: crea una porta */ if (mp==O) return 10; /* Inizializzazione della struttura NotifyRequest */ nr.nr P stuff.nr-Msg.nr-Port=mp; /* la porta cui inviare i messaggi */ nr . nr-Name=argv [l ] ; /* usa il nome della linea di comando */ nr.nr-Flags=NRF-SENDMESSAGEI /* chiede metodo con messaggi, */ NRF-NOTIFY-INITIALI /* la notifica dell'esistenza */ NRFJAIT-REPLY; /* e di attendere il reply prima di inviare la notifica successiva */ if (StartNotify (&nr) ==DOSFALSE) return 5; /* inizio della notifica */ WaitPort (mp) ; /* attendiamo il messaggio */ nm= (struct Notif yMessage *) GetMsg (mp) ; /* è arrivato il primo messaggio: il file ora esiste */ ReplyMsg( (struct Message *) nm) ; /* replichiamo */ WaitPort (mp) ; /* attendiamo il secondo messaggio */ /* ora il file è stato modificato */ nm= (struct NotifyMessage *) GetMsg (mp) ; I EndNotify (&m) ; /* fine notifica */ ReplyMsg ( (struct Message *) nm) ; /* replichiamo */ DeleteMsgPort (mp) ; /* funzione del 2.0: cancella la porta */ return 0; Figura 3: un semplice esempio di uso della notifica una stringa (allocata automaticamente) il cui indirizzo verrà posto nel campo nr-FullName. E' semplicemente una comodità in più: di fatto l'handler farà riferimento unica- mente alla stringa nr-FullName. Owiamente, è sempre possibile inserire un nome assoluto anche in nr-Name. I1 resto dei campi va inizializzato come abbiamo visto in precedenza. Dopo aver usato tale funzione possiamo metterci in attesa dei messaggi o dei segnali. Se usiamo i messaggi dovremo replicare ad ognuno di essi mediante la funzione Re- plyMsg( ) di Exec. Quando vorremo interrompere la notifi- ca, perché non ci interessa più o perché abbiamo concluso, dovremo semplicemente usare la funzione EndNotify( ) che prevede lo stesso parametro e lo stesso valore di ritorno di StartNotify( ). La funzione estrae l'indirizzo della porta dell'handler cui inviare il pacchetto dal campo nr- >nr-Handler e pertanto non richiede altro parametro. In figura 3 compare un breve listato in C che chiede la notifica su un file il cui nome deve essere indicato sulla linea di comando e attende finché il file nonviene modificato. Gli include sono owiamente quelli del 2.0, il compilatore è il SAS. I1 codice oggetto va linkato con llamiga.lib del 2.0. Si noti che, nel listato, la replica all'ultimo messaggio dell'handler awiene dopo aver concluso la notifica con EndNotify( ). E' stato fatto per evitare che si accodino alla porta dei nuovi messaggi cui altrimenti avremmo dovuto replicare; infatti, avendo noi usato il flag NRF-WAIT-REPLY, l'handler non invierà nuovi messaggi finché non riceverà la replica ai precedenti. Gli handler, fra l'altro, devono essere attrezzati per ricevere repliche a notificazioni non più in corso e non devono più inviare messaggi dopo la ricezione del pacchetto REMOVE-NOTIFY. Si ricordi che la notifica non viene supportata da tutti gli handler che funzionano sotto 2.0, per cui si deve essere sempre pronti ad affrontare le situazioni di questo tipo. Dalla versione 37 del DOS, la W: e il file system per i dischi supportano tali pacchetti. La Commodore awerte che molti handler per la gestione di reti funzionanti sotto 2.0 non supportano invece tale pacchetto. Ma in quali casi awiene la notifica? I1 manuale delllAmiga-

DOS 2.0 elenca una serie di pacchetti che "potrebbero" generarla, ma non dice quali effettivamente la generino e sotto quali condizioni. Dalle prove da me effettuate sugli handler del 2.0 (RAM: e DFO:) ho appurato che la notifica viene inviata quando un file (non una directory) viene creato, cancellato, rinominato, datato, quando viene modi- ficato con un Write( ) o con SetFileSize( ). Si noti che la notifica awiene solamente nel momento in cui il file viene chiuso (Close( )) dal programma che l'ha modificato, cioè al termine delle operazioni di scrittura. Nel caso di una directory, le cose cambiano: la notifica infatti awiene quando la directory viene creata, cancellata, rinominata e datata, oppure quando viene creato (non basta la modifica, né il rename, né la cancellazione) un file al suo interno (che può essere owiamente anche una subdirectory). Non awiene, invece, se si cambia il contenu- to di una subdirectory. I1 mutamento dei bit protezione o del commento di un file non causano mai la notifica. Non è impossibile che altri handler le producano in situazioni parzialmente diverse. I1 concetto, in generale, dovrebbe essere: la notifica viene inviata quando è necessario rileggere il file o la directory per stabilirne l'esatto contenuto. Trovo strano però che la notifica non avvenga quando viene cancellato un file appartenente a una directory di cui si è chiesta la notifica (e lo stesso dicasi per il rename). Le applicazioni possibili della notifica sono infinite: già il semplicissimo file che abbiamo presentato in figura 3 potrebbe essere usato da uno script per funzionare in sincronia con un altro script concorrente, attraverso l'uso di un file, posto per esempio in T:, che funga da rudimentale semaforo. segue da pag. 37 Guida tecnico-pratica agli hard-disk anni: 1'RDB. Tutti i controller Commodore, ad eccezione del11A2090 e A2090a, supportano I'RDB. Con questa sigla si indicano le prime due tracce dell'hard disk, che nei control- ler moderni contengono le informazioni necessarie per identificare il tipo di hard disk, le partizioni e i filesystem da usare. Un hard disk formattato su un qualsiasi controller supportante I'RDB può essere collegato a qualsiasi altro controller e i dati saranno perfettamente utilizzabili sulla nuova macchina, esattamente come awiene nei persona1 Apple e a differenza di altri sistemi operativi. Questa caratteristica è owiamente essenziale se si intende usare un hard disk removibile o portatile, in modo da potere scambiare dati con altri Arniga senza usare pile di dischetti. Un RDB difettoso o incongruente può rendere inaccessibile al sistema operativo I'hard disk esattamente come se fosse guasto. Prima di spaventarsi non vedendo apparire l'icona dell'hard disk sul Workbench, è bene provare a reinizializ- zare 1'RDB con i programmi in dotazione al controller, servendosi dei dati (inizio, fine, nome delle partizioni; elenco dei bad-block e dei filesystem) che certamente avevate annotato su un foglio al momento di installare l'hard disk. Poiché le prime due tracce sono riservate all'RDB, e poiché quelle informazioni stanno agevolmente in 34 settori circa, avendo un hard disk SCSI che lo consenta, si può guada- gnare qualche decina di kilobyte di capacità utile avendo l'accortezza di dichiarare al momento della formattazione che l'hard disk possiede 17 settori per traccia e 1 o 2 superfici. L'ultima cosa da tenere presente per l'acquisto, è che talvolta quella che sulla carta sembra un'ottima scelta, in pratica genera incompatibilità o problemi. La fonte princi- pale di problemi nel caso degli hard disk è la presenza di una scheda acceleratrice non perfettamente conforme alle specifiche; di regola non si incontrano problemi se si fa uso di prodotti di marche serie e affermate. Se non si hanno buone conoscenze tecniche per risolvere gli eventuali problemi, è preferibile evitare di andare alla spasmodica ricerca del risparmio e delle combinazioni strane, per evitare di trovarsi di fronte a problemi che la maggior parte dei venditori, più esperti di IBM compatibili che di Amiga, non sa risolvere.

I I<br />

extern struct Library *DOSBase;<br />

struct NotifyRequest nr;<br />

struct MsgPort *mp;<br />

struct NotifyMessage *nm;<br />

main (long argc, char **argv)<br />

t<br />

if (argc!=2) return 10;<br />

mp=CreateMsgPort ( ) ; /* funzione del 2.0: crea una<br />

porta */<br />

if (mp==O) return 10;<br />

/* Inizializzazione della struttura NotifyRequest<br />

*/<br />

nr.nr P stuff.nr-Msg.nr-Port=mp; /* la porta cui<br />

inviare i messaggi */<br />

nr . nr-Name=argv [l ] ; /* usa il nome<br />

della linea di comando */<br />

nr.nr-Flags=NRF-SENDMESSAGEI /* chiede metodo<br />

con messaggi, */<br />

NRF-NOTIFY-INITIALI /* la notifica<br />

dell'esistenza */<br />

NRFJAIT-REPLY; /* e di attendere<br />

il reply prima<br />

di inviare la notifica<br />

successiva */<br />

if (StartNotify (&nr) ==DOSFALSE) return 5; /* inizio<br />

della notifica */<br />

WaitPort (mp) ; /* attendiamo il messaggio */<br />

nm= (struct Notif yMessage *) GetMsg (mp) ;<br />

/* è arrivato il primo messaggio: il file ora<br />

esiste */<br />

ReplyMsg( (struct Message *) nm) ; /* replichiamo */<br />

WaitPort (mp) ; /* attendiamo il secondo messaggio<br />

*/<br />

/* ora il file è stato modificato */<br />

nm= (struct NotifyMessage *) GetMsg (mp) ;<br />

I<br />

EndNotify (&m) ; /* fine notifica */<br />

ReplyMsg ( (struct Message *) nm) ; /* replichiamo */<br />

DeleteMsgPort (mp) ; /* funzione del 2.0: cancella<br />

la porta */<br />

return 0;<br />

Figura 3: un semplice esempio di uso della notifica<br />

una stringa (allocata automaticamente) il cui indirizzo verrà<br />

posto nel campo nr-FullName. E' semplicemente una<br />

comodità in più: di fatto l'handler farà riferimento unica-<br />

mente alla stringa nr-FullName. Owiamente, è sempre<br />

possibile inserire un nome assoluto anche in nr-Name. I1<br />

resto dei campi va inizializzato come abbiamo visto in<br />

precedenza.<br />

Dopo aver usato tale funzione possiamo metterci in attesa<br />

dei messaggi o dei segnali. Se usiamo i messaggi dovremo<br />

replicare ad ognuno di essi mediante la funzione Re-<br />

plyMsg( ) di Exec. Quando vorremo interrompere la notifi-<br />

ca, perché non ci interessa più o perché abbiamo concluso,<br />

dovremo semplicemente usare la funzione EndNotify( )<br />

che prevede lo stesso parametro e lo stesso valore di ritorno<br />

di StartNotify( ). La funzione estrae l'indirizzo della porta<br />

dell'handler cui inviare il pacchetto dal campo nr-<br />

>nr-Handler e pertanto non richiede altro parametro.<br />

In figura 3 compare un breve listato in C che chiede la<br />

notifica su un file il cui nome deve essere indicato sulla linea<br />

di comando e attende finché il file nonviene modificato. Gli<br />

include sono owiamente quelli del 2.0, il compilatore è il<br />

SAS. I1 codice oggetto va linkato con llamiga.lib del 2.0.<br />

Si noti che, nel listato, la replica all'ultimo messaggio<br />

dell'handler awiene dopo aver concluso la notifica con<br />

EndNotify( ). E' stato fatto per evitare che si accodino alla<br />

porta dei nuovi messaggi cui altrimenti avremmo dovuto<br />

replicare; infatti, avendo noi usato il flag<br />

NRF-WAIT-REPLY, l'handler non invierà nuovi messaggi<br />

finché non riceverà la replica ai precedenti. Gli handler, fra<br />

l'altro, devono essere attrezzati per ricevere repliche a<br />

notificazioni non più in corso e non devono più inviare<br />

messaggi dopo la ricezione del pacchetto<br />

REMOVE-NOTIFY.<br />

Si ricordi che la notifica non viene supportata da tutti gli<br />

handler che funzionano sotto 2.0, per cui si deve essere<br />

sempre pronti ad affrontare le situazioni di questo tipo.<br />

Dalla versione 37 del DOS, la W: e il file system per i<br />

dischi supportano tali pacchetti. La Commodore awerte<br />

che molti handler per la gestione di reti funzionanti sotto 2.0<br />

non supportano invece tale pacchetto.<br />

Ma in quali casi awiene la notifica? I1 manuale delll<strong>Amiga</strong>-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!