Autore Topic: Impossibile riaprire un file-device dopo averlo chiuso  (Letto 3089 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Impossibile riaprire un file-device dopo averlo chiuso
« il: 21 Marzo 2012, 00:03:29 »
Problema:
Ho riscontrato che, dopo aver aperto con OPEN "...." For Read Watch  un file-device (in:  /dev/...) per intercettarne il flusso dei dati che passano lì da un dispositivo esterno, se lo chiudo, e poi tento di riaprilo, non ci riesco: non si riapre più !  :hard:

Esempio:
Codice: gambas [Seleziona]

Private fd As File


Public Sub ToggleButton1_Click()

  If Last.value Then
' apro il file-device che mi interessa:
     fd = Open "/dev/file-device_da_aprire" For Read Watch
   Else
' chiudo il file-device:
     Close #fd
  Endif

End


Public Sub File_Read()
  
  Dim b As Byte
  
  Read #fd, b
' vedo in console i dati raccolti:
  Print b

End


...ma perché ?  ??? Non dovrebbe comportarsi come un "file" qualsiasi ?


(Aprendolo come processo con Process, riesco, se lo chiudo, a riaprirlo, ma... questa è un'altra storia...)
« Ultima modifica: 21 Marzo 2012, 01:08:30 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline alcresio

  • Grande Gambero
  • ***
  • Post: 100
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #1 il: 21 Marzo 2012, 03:31:27 »
????????
Non ti so proprio aiutare, non ho mai provato ad aprire un device con gb3... Con gb2 scrissi del codice per 'sniffare' la seriale, e non ricordo di aver avuto problemi di questo tipo...
Aggiorna fiducioso e vedrai che forse funzionerà!  ;D

In questi giorni sono preso a scrivere codice a tutta manetta  :coder: con una piattaforma di sviluppo commerciale (non cito il nome ma non è di microsoft)...
ho poco tempo da dedicare alla ricerca Gambas, altrimenti ti avrei chiesto info e ti avrei dato una mano...

Buona fortuna
A presto!

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #2 il: 21 Marzo 2012, 13:26:50 »
mi sembra che non sia una bella cosa aprire un device in quel modo, dovresti creare una pipe (non chiedermi come :) )

altrimenti prova a leggere i dati con cat /dev/ecc,


Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #3 il: 21 Marzo 2012, 14:11:24 »
mi sembra che non sia una bella cosa aprire un device in quel modo, dovresti creare una pipe (non chiedermi come :) )

altrimenti prova a leggere i dati con cat /dev/ecc,

Perché ritieni che non sia proprio ortodosso aprire un file-device con OPEN ?

Relativamente alla possibilità di creare una "pipe", neppure io ad oggi so !  Qualche altro "mostro sacro" di questo forum può dire/suggerire qualcosa al riguardo ?


Invece, per quanto riguarda il tentativo con cat /dev/ecc, questo l'ho già fatto. E' appunto il riferimento che facevo a Process. Confesso che non ci avevo pensato, prima; poi ho fatto il tentativo, e la ricezione dei dati funziona. Come ho già scritto, gestendo con Process funziona anche l'interruzione e la riapertura del flusso di dati dal file-device.
Ho fatto sostanzialmente così:
Codice: gambas [Seleziona]

Private flDev As Process


Public Sub ToggleButton1_Click()

  If Last.value Then
' apro il file-device:
    flDev = Exec ["cat", "/dev/file_device_da_gestire"] For Read As "flDev"
   Else
' lo chiudo; ma se ri-clicco sul ToggleButton riesco a riaprire il File-Device:
    fdDev.Kill
  Endif

End


Public Sub flDev_Read()
  
 Dim b As Byte
  
  Read #flDev, b
  
  Print b
  
End
« Ultima modifica: 21 Marzo 2012, 14:20:07 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #4 il: 21 Marzo 2012, 14:18:12 »
Citazione
Perché ritieni che non sia proprio ortodosso aprire un file-device con OPEN ?
ho scritto "mi sembra" questo perchè mi pare di cordare di aver letto da qualche parte che non si deve aprire un device direttamente per evitare blocchi o altri problemi , però ti ripeto non fa parte di una mia conoscenza , ma solo un ricordo di qualcosa letto da qualche parte molto tempo fa , percui lascia il tempo che trova  :)  

Sicuramente md... saprà illuminarci al riguardo.

per il pipe :
 file:///usr/share/gambas2/help/help/lang/pipe.html

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #5 il: 21 Marzo 2012, 14:23:53 »
Sicuramente md... saprà illuminarci al riguardo.
Santo md9327  :angel: ...... ora pro nobis !  :'(


per il pipe :
 file:///usr/share/gambas2/help/help/lang/pipe.html
Non sembra più attivo questo collegamento !  :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #6 il: 21 Marzo 2012, 14:29:46 »
dovresti creare una pipe (non chiedermi come :) )
Forse qua ?  :-\
http://gambasdoc.org/help/lang/pipe
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #7 il: 21 Marzo 2012, 15:11:53 »
dovresti creare una pipe (non chiedermi come :) )
Forse qua ?  :-\
http://gambasdoc.org/help/lang/pipe
Per cominciare a vedere se leggo i dati, avrei scritto una cosa di questo genere:  :-X
Codice: gambas [Seleziona]

flSt As File


Public Sub Form_Open()

  flSt = Pipe "/dev/file_device_da_gestire" For Read Watch

End


Public Sub Pipe_Read()
  
  Dim b As Byte
  
  Read #flSt, b
  
  Print b

End


...ma non vedo dati comparire in console !  :skull:
 :-\
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #8 il: 21 Marzo 2012, 15:23:56 »
Mò pure santo mi pare davvero troppo... e sono pure ateo...  ;D

In "primis" mi sfugge cosa e quale device vuoi usare...
Le modalità di apertura possono essere diverse, senza contare diritti "e doveri" e quant'altro...

Oltre alla seriale, tramite esperimenti fatti con G1, non poi approfondito le possibilità di pilotare qualcos'altro con Gambas.
La cosa può essere molto pericolosa, ad esempio aprire il device sui dischi mentre sono utilizzati dal kernel...

Dall'esempio che riporti, in realtà non stai agendo direttamente con Gambas sul device, bensì tramite una chiamata al sistema operativo di un semplice comando "cat". A parte che con "cat" diretto su device può portare a risultati incontrollabili, questo comando è stato creato per leggere flussi di dati seriali, e quindi non è detto che possa funzionare con un qualsiasi device.

Ritornando alla seriale di cui sopra, la lettura dei dati avviene tramite apposito driver, a cui vengono passati appositi parametri, necessari a istruire il device sulla modalità di scambio dati e sul tipo di protocollo usato. Con "cat" questo non avviene, quindi "ciapa" tutta la monnezza, senza alcuna logica, che passa per il device.

Quindi, prima di parlare di perchè "non funziona", sarebbe il caso che ci spiegassi cosa stai cercando di fare, e non in modo così generico...  :-\

P.S.: A proposito, ma "cesko" l'hanno preso le guardie?!?  ;D

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #9 il: 21 Marzo 2012, 16:44:23 »
Quindi, prima di parlare di perchè "non funziona", sarebbe il caso che ci spiegassi cosa stai cercando di fare, e non in modo così generico...  :-\
Sì, hai ragione: ci vuole "precisione".

Dunque... l'argomento da me posto è relativo all'intercettazione di dati grezzi provenienti da un dispositivo Midi (...tanto per cambiare  ;D ) esterno (per esempio una tastiera). In vero, non ho problemi nell'intercettare tali dati, poiché i modi possono essere diversi (Vedi in basso nota 1).
Quasi tutti (tranne uno) i programmini da me realizzati, che intercettano dati Midi dall'esterno, adoperano questa riga di comando:
 
Codice: gambas [Seleziona]
flusso = OPEN "/dev/snd/midiC2D0" For Read Watch

laddove "/dev/snd/midiC2D0" è il file-device che viene creato nel momento in cui viene connessa una tastiera Midi al PC.

Ad un certo punto... mi è venuto in mente di offrire all'utente la possibilità, dopo aver aperto il file-device per ricevere i dati,  di richiuderlo mediante:
Codice: gambas [Seleziona]
Close #flusso

per bloccare l'intercettazione dei dati (cosa che avviene); nonché di consentirgli poi di ri-aprirlo, qualora voglia ricominciare a ricevere dati dal dispositivo Midi esterno, passando nuovamente per la riga di apertura con OPEN.

Ebbene, la riapertura non avviene.

Se, invece, questo procedimento lo effettuo gestendo il file-device con Process, posso chiuderlo e riaprirlo tutte le volte che voglio.

Lo so... qualcuno potrebbe dire:« Allora opera con "Process" ! ». Ma non vorrei usare Exec o Shell. Inoltre a questo punto vorrei comprendere la questione.



Vorrei fare un aggiornamento sulla questione di Pipe, poco sopra esposta.
Ho provato a fare una modifica alla riga: Public Sub Pipe_Read(). Avevo scritto Pipe_Read(), come avevo letto nella guida:    
« Se la parola chiave WATCH viene specificata, la pipe viene vista dall'interprete come:        
  * Se alla fine della pipe può essere letto un byte, allora viene chiamato l'evento Pipe_Read().
».
Ma come ho già detto, non leggo dati. Ed allora ho modificato quella riga così:

Codice: gambas [Seleziona]
Public Sub File_Read()

...e così funziona, nel senso che l'evento è sollevato, ed io sono in grado di leggere i dati.
Però, anche con Pipe se chiudo, e poi voglio ri-aprire il flusso, non si ri-apre (così come succedeva con Open), e non posso dunque tornare a leggere dati.

Un paio di domande:
* come mai con Pipe_Read() non viene sollevato l'evento ?
* ma soprattutto... in questo caso è meglio usare "Pipe" al posto di "Open" ?   ???


Note:
[1] Al riguardo vedi: http://www.gambas-it.org/wiki/index.php/Gestione_del_MIDI_con_ALSA#Alsa_e_Gambas:_Gestione_dei_dati_Midi_in_.22Ricezione_dati.22





P.S.: A proposito, ma "cesko" l'hanno preso le guardie?!?
...effettivamente...... è sparito ! ???
« Ultima modifica: 22 Marzo 2012, 00:13:12 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #10 il: 22 Marzo 2012, 11:09:12 »
Allora, qualche appunto:

1) fai per caso un flush() prima della chiusura? Anche se sei in sola lettura, farlo non guasta, magari svuota il buffer del canale di comunicazione.
2) è probabile ci sia un buchetto nelle funzioni di Gambas. Questo me lo fà pensare, in quanto con Shell, dato che chiami un programma esterno, potrebbe esserci qualcosa che non và nei metodi.
3) sei sicuro che il canale và chiuso? L'apertura di quel tipo di device potrebbe essere solo un fatto di ritorno del puntatore al canale di comunicazione, tantè che sembra non necessitare di parametri.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #11 il: 22 Marzo 2012, 15:34:18 »
1) fai per caso un flush() prima della chiusura? Anche se sei in sola lettura, farlo non guasta, magari svuota il buffer del canale di comunicazione.
Ho provato a piazzare Flush appena prima del comando di chiusura, così:
Codice: gambas [Seleziona]

Flush
Close #flusso

ma le cose non sono cambiate.  :-\


2) è probabile ci sia un buchetto nelle funzioni di Gambas. Questo me lo fà pensare,
...non si può escludere, certo.


3) sei sicuro che il canale và chiuso?
...quindi, in tal caso, l'unico modo per bloccare intercettazione dei dati è escogitare una diversa soluzione che non chiuda il file-device ?!



Ah, scusami, dimenticavo di segnalare che alcuni mesi fa ho provato la ri-apertura del file-device con Open su KUBUNTU (io uso ordinariamente MINT) e la cosa stranamente.. funzionava !  :o Questo fatto mi ha aumentato la confusione !
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #12 il: 22 Marzo 2012, 15:40:51 »
Citazione
Ho provato a piazzare Flush appena prima del comando di chiusura, ma le cose non sono cambiate. 
Lo supponevo...

Citazione
Ah, scusami, dimenticavo di segnalare che alcuni mesi fa ho provato la ri-apertura del file-device con Open su KUBUNTU (io uso ordinariamente MINT) e la cosa stranamente.. funzionava !  :o Questo fatto mi ha aumentato la confusione !
Questo mi fà pensare allora più ad un problema di compilazione e di librerie...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #13 il: 22 Marzo 2012, 16:44:09 »
Questo mi fà pensare allora più ad un problema di compilazione e di librerie...
Uhmmmm... quindi c'è - per ora - poco da fare, se voglio usare Open. O meglio: scrivere una soluzione che "aggiri" quel problema senza chiudere il file-device.

Va be'... !
Grazie molte md9327, e agli altri i intervenuti; anche a Milio, con il quale ho avuto un breve scambio di opinioni su questo argomento a livello privato.


Aggiungo che la storia non è proprio del tutto finita: sto facendo alcune prove e riscontri.  :coder: Vi farò sapere.
« Ultima modifica: 22 Marzo 2012, 23:55:29 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.390
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Impossibile riaprire un file-device dopo averlo chiuso
« Risposta #14 il: 23 Marzo 2012, 13:33:31 »
Aggiungo che la storia non è proprio del tutto finita: sto facendo alcune prove e riscontri.  :coder: Vi farò sapere.

Qualcuno  :angel: mi ha suggerito di fare un test con il Timer, estromettendo quindi la parola "Watch":

Codice: gambas [Seleziona]

fdMid As File

Public Sub Form_Open()

  fdMid = Open "/dev/snd/midiC2D0"

End


Public Sub Timer1_Timer()
  
  Dim b As Byte
  
  While Not Lof(fdMid)
    Read #fdMid, b
    Print b
 Wend

End

Public Sub Button1_MouseDown()  ' chiude il file-device

  Timer1.Stop
  Close #fdMid

End

Public Sub Button2_MouseDown()  ' Ri-apre il file-device

  Timer1.start
  Form_Open()

End


Dunque, effettuato il test con Timer senza Watch, riesco a chiudere e poi a ri-aprire il file-device. Ciò farebbe pensare che ci sia quindi un problema con la sollevazione dell'evento, con Watch (....un baco di Gambas ?  :hatecomputer: ).

C'è una curiosità con l'uso di Timer: come avrete notato, ho scritto la riga di apertura del file-device senza neppure "For Read". Infatti se faccio la prova con la riga:
Codice: gambas [Seleziona]

fdMid = Open "/dev/snd/midiC2D0" For Read

non ricevo dati !  ???
Li ricevo, solo se scrivo così:
Codice: gambas [Seleziona]

fdMid = Open "/dev/snd/midiC2D0"

 :rolleyes:
Mi sembra davvero incomprensibile questo fatto ! Perché con quella soluzione con Timer non posso usare la parola "For Read" ?  ??? Che problemi ed implicazioni porterebbe all'apertura o alla lettura del file-device ? "For Read" non significa semplicemente che il file è aperto al fine di essere letto ? ...un altro baco-Gambas ? O[[[[[[[[[[[[
« Ultima modifica: 23 Marzo 2012, 13:43:11 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »