Forum: Mikrocontroller und Digitale Elektronik RaspberryPi Fehler: libc.so.6: Error 24


von Peter N. (customer23)


Lesenswert?

Hallo!

Ich habe momentan ein Problem mit meinem Raspberry, an dem ich 
mittlerweile schon 4 Tage ohne Erfolg arbeite.

Ich führe eine Temperaturmessung mit 6 Sensoren durch(Adafruit Max31855 
BreakoutBoard).
Diese Werte gebe ich auf einem LCD-Display aus und speichere sie in 
einer .csv-Datei.

In den ersten paar Minuten des Programmablaufs funktioniert alles 
prächtig, doch nach ca. 3-4 Minuten bekomme ich eine Fehlermeldung am 
Terminal.
"
sh: error while loading shared libraries: libc.so.6: cannot open shared 
object file: Error 24
"

Google konnte mir hier auch nicht weiterhelfen...

Danke im Voraus!

von P. E. (philenotfound)


Lesenswert?

Errno 24 = "Too many open files".

Google weiß das aber.

von Peter N. (customer23)


Lesenswert?

"Too many open files" hab ich auch gefunden.
Nur weiß ich nicht, wie genau ich das verstehen soll...

Mein Programm arbeitet folgendermaßen:
Ich kommuniziere mit meinen Sensoren über SPI.
Da das Raspberry nur 2 Chip-Select-Pins hat, verwende ich eine 
Logikschaltung, bei der ich mit Chip-Select und einzelnen Port-Pins die 
Sensoren auswähle.
In dem Thread, in dem ich die Messung durchführe, schalte ich zunächst 
alle Sensoren bzw. alle Select-Pins aus und anschließend den einen 
benötigten ein.
So wird der Wert übertragen, welcher dann in einem anderen Thread in 
eine .csv-Datei gespeichert wird.

Meine Frage nun: Welche Files öffne ich denn, dass ich zu viele hätte?

von Peter II (Gast)


Lesenswert?

Peter N. schrieb:
> Meine Frage nun: Welche Files öffne ich denn, dass ich zu viele hätte?

suche doch mal in deinen code ob du zu jeden open auch ein close hast.

von Peter II (Gast)


Lesenswert?

lsof könnte dir auch weiterhelfen.

von W. M. (thematsche)


Lesenswert?

Wie Pedro schon schrieb, es scheint sich um ein Open in einer Schleife 
zu handeln.
Das dazugehoerige Close ist aber ausserhalb der Schleife.

von Peter N. (customer23)


Lesenswert?

Mein Source-Code sieht so aus:

def writeFile():
    global Intervall
    num = 0

    fileTemp = open('TempFile.csv','wb')
    writerTemp = csv.writer(fileTemp, delimeter='\t', quotechar='"',
                                                  quoting=csv.QUOTE_ALL)
    writerTemp.writerow(["Nummer", "Header","..."])

    try:
       while(1):
          num = num+1
          writerTemp.writerow([num, "Temperatur1","..."])
          sleep(Intervall)
    except:
       fileTemp.close()
       return
    finally:
        fileTemp.close()

von Peter N. (customer23)


Lesenswert?

Mein Fehler ist nun etwas konkreter geworden.
Anscheinend liegt es nicht an der .csv-Datei, sondern an meinem
SPI-Interface.
Ich bekomme die Fehlermeldung:
"
File 
"/usr/local/lib/python2.7/dist-packages/quick2wire_api-0.0.0.3-py2.7.egg 
/quick2wire/spi.py",  line 40, in _init_
OSError: [Errno 24] Too many open files: '/dev/spidev0.0'
"

Ich habe schon versucht, spidev0.0 während des Programmablaufs 
zurückzusetzen - jedoch ohne Erfolg.

Irgendwelche Ideen, wie ich dieses Problem lösen könnte?

von Mario G. (mario)


Lesenswert?

Kompletten Source-Code posten könnte helfen...

von Peter N. (customer23)


Angehängte Dateien:

Lesenswert?

Anbei eine gekürzte Version meines Programms.

von Mario G. (mario)


Lesenswert?

Da ist kein File-Open drin?!

von Peter II (Gast)


Lesenswert?

Mario Grafe schrieb:
> Da ist kein File-Open drin?!

aber Threads und diese haben auch handels. Oder versteckt in den I2C 
dingen.

Mache doch mal ein "lsof" nach dem das Programm gestartet ist.

von Peter N. (customer23)


Angehängte Dateien:

Lesenswert?

Nein - Das ist ja gerade das, was mich so irritiert.
Wenn man jedoch eine Stufe tiefer geht, nämlich in das Python-Modul 
"quick2wire.spi "selbst, ist ein einziges 'open' zu finden.

von W. M. (thematsche)


Lesenswert?

ja, aber du machst in selectSensor jedesmal

thermocouple = MAX31855(0, "c")

wo ein

self.spi = Spibus.SPIDevice(self.pin, 0)

drinnen ist.
solltest viell. beim ausstieg aus selectSensor sowas wie

thermocouple.spi.close()

machen.

von Peter N. (customer23)


Lesenswert?

Walter M. schrieb:
> ja, aber du machst in selectSensor jedesmal
>
> thermocouple = MAX31855(0, "c")
>
> wo ein
>
> self.spi = Spibus.SPIDevice(self.pin, 0)
>
> drinnen ist.
> solltest viell. beim ausstieg aus selectSensor sowas wie
>
> thermocouple.spi.close()
>
> machen.

You, sir, are a genius!

Vielen Dank! Jetzt funktioniert alles einwandfrei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.