Java && Kernel Devices

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
The Torso
Beiträge: 882
Registriert: 13.07.2003 12:46:40
Lizenz eigener Beiträge: MIT Lizenz

Java && Kernel Devices

Beitrag von The Torso » 12.06.2006 14:58:45

Bitte nicht schlagen, ich weiss dass das was ich vorhabe eigentlich vollkommen idiotisch ist, aber ich muss es nunmal so machen....

Also, es geht um folgendes:
Ich habe ein spezielles Kernel Device im /dev-Verzeichnis auf das ich lesend Zugreife. Die Berechtigungen auf dem Device sind 777. Das Device ist ein einfaches Charakter-Device, das heisst ich kann mit einem simplen FileInputStream darauf zugreifen und auch lesen.
Das alles funktioniert ja schon ganz schoen, das macht auch grundsaetzlich keine Probleme, aber - das ganze soll in einem Thread in einer Schleife laufen und es soll deshalb immer ueberprueft werden, ob am device was zum lesen ist.
Dazu verwende ich einen BufferedReader mit read - wobei read blockiert bis was zum lesen ist. Das funktioniert auch - aber nur das erste Mal. Danach liefert read immer nur -1 und die Schleife hoert nicht mehr auf bzw. read blockiert nicht mehr.

Das ganze schaut als in etwa so aus:

Code: Alles auswählen

while ( true ) {
	if ( reader.read( chars ) != -1 )
		break;
}
Hat da jemand ne Idee warum read ab dem zweiten Durchlauf nur mer -1 liefert und nicht mehr blockiert? - oder wie man das Problem besser Loesen kann?

mfg
cg
Debian GNU/Linux 00101010

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 12.06.2006 15:07:47

hallo,

while (true) ... bezieht sich das auf den thread ?
wenn ja: es ist besser einen thread "höflich" zu beenden.

Code: Alles auswählen

while (!isInterrupted) { ... }
ansonsten müsste das so funktionieren:

Code: Alles auswählen

BufferedReader buffer;
...
while (buffer.read()!=-1) { 
 String line=buffer.readLine() 
}
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 12.06.2006 15:47:46

HALT! falsch ... ich sollte in zukunft besser lesen ;)

es muss so sein:

Code: Alles auswählen

t = new Thread(new Runnable() {
      public void run() {
        String line = "";
        while(!t.isInterrupted()) {
          try {
            line = buffer.readLine();
            if (line != null) {
              System.out.println("read: "+line);
            } else {
              Thread.sleep(1000);
            }
          } catch (IOException e) {
            e.printStackTrace();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    });
    t.start();
  }
du willst ja ein device lesen, auch dann, wenn grade nichts geschrieben
wird. Da der FileInputStream nicht weiss, ob noch was kommt, oder
halt nicht, sollte man readLine() öfters aufrufen (evtl. mit einem
sleep dazwischen).

Das obige habe ich mit /var/log/messages probiert und verhält
sich im prinzip wie "tail -f"
Das könntest du übertragen (InputStream.read statt buffer.readLine und
if (InputStream.available() > 0) statt if (line != null )

hoffe es hilft ;)
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Benutzeravatar
Pischti
Beiträge: 417
Registriert: 20.02.2002 12:54:18
Wohnort: dresden

Beitrag von Pischti » 13.06.2006 09:01:40

hab geradfe kein java vor mir, darum nur grob geschätzt:
es gab da auch eine methode namens

Code: Alles auswählen

 bytesAvailable()
oder so ähnlich, wo man auslesen konnte, ob in dem stream auch gerade was drinsteht. das war für die" sichere" schleife ne ganz gute sache


edit:
hm, hab gerade gelesen, das finupsen das ja auch schon geschrieben hat ... egal :-)
gruss pischti
debian stable

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 13.06.2006 09:12:26

Na wenigstens bin ich hier nicht der einzige mit tomaten auf den augen ;)
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Antworten