Segmentation fault bei Schreiben in Dateien

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Hallo zusammen!

Ich hab ein kleines Problem und steh mit der Lösung auf dem Schlauch.

Ich will, dass ein Programm zwei Werte in zwei Dateien ersetzt.
Sprich in jeder Datei steht der Wert 128 und ich will einen neuen reinschreiben.

Ich habe versucht

Code: Alles auswählen

		FILE_brightness = open("/proc/stb/video/plane/psi_brightness","w")
		FILE_brightness.write("140")
		FILE_brightness.close()
		FILE_contrast = open("/proc/stb/video/plane/psi_contrast","w")
		FILE_contrast.write("120")
		FILE_contrast.close()
und ich habe versucht

Code: Alles auswählen

		open("/proc/stb/video/plane/psi_brightness","w").write("140")
		open("/proc/stb/video/plane/psi_contrast","w").write("120")
In beiden Fällen sind die Dateien danach im Eimer und geben Segmentation fault zurück.

Ich sehe aber spontan nicht wieso.
Ich kann mit

Code: Alles auswählen

echo 120 > /proc/stb/video/plane/psi_contrast
mühelos den Wert via Konsole schreiben. Aber aus dem py raus geht es nicht.

Hat jemand eine Idee wieso?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Generell solltest Du Dateien mit dem "with open as handler" Idiom öffnen:

Code: Alles auswählen

with open(fielname, modus) as filehandler:
    filehandler.read() # oder was sonst noch
Kann es sein, dass Du die Dateien im Binärmodus öffnen musst? Wo kommt der der Segmentation Fault? Beim Ausführen des Python-Scriptes?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Der segmentation fault kommt sobald ich versuche mit cat die Werte auszulesen oder sonst irgendwie auf die Datei zugreifen will. Das System friert dann einfach ein, weil es die Werte aus der Datei nicht mehr lesen kann.

"echo" schreibt doch nicht im Binärmodus? Das ist doch ASCII. :?:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mocca hat geschrieben:Der segmentation fault kommt sobald ich versuche mit cat die Werte auszulesen oder sonst irgendwie auf die Datei zugreifen will. Das System friert dann einfach ein, weil es die Werte aus der Datei nicht mehr lesen kann.
Und nach dem "echo" klappt es, schlussfolgere ich jetzt mal?
"echo" schreibt doch nicht im Binärmodus? Das ist doch ASCII. :?:
Stimmt wohl. Schreibt echo da noch irgend welche Whitespaces rein, die notwendig sind? Zeilenumbruch o.ä.?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Ja, wie erwähnt, mit echo kein Problem.

Ich wüsst auch nicht, dass echo sonst etwas schreibt. Nur den Wert. Keine Zeilenumbrüche o.ä.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich vermute mal Zahlenwerte haben in den meisten gängigen Codecs dieselben Codepoints; ansonsten wäre eine falsche Codierung sonst noch etwas, was mir einfallen würde. Aber wie gesagt, vermute mal, dass Ziffern bei allen gängigen Codecs dieselben Codepoints haben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

dass Ziffern bei allen gängigen Codecs dieselben Codepoints haben
Tut mir leid, ich verstehe nicht, was das bedeutet bzw. was das für mich heisst :oops: :K
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Code: Alles auswählen

sparrow@io:/tmp$ echo 120 > test.txt
sparrow@io:/tmp$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> with open("test2.txt", "w") as f:
...  f.write("120")
... 
>>> with open("test3.txt", "w") as f:
...  f.write("120\n")
... 
>>> quit()
sparrow@io:/tmp$ hex test.txt 
0x00000000: 31 32 30 0a             -                         120J
sparrow@io:/tmp$ hex test2.txt 
0x00000000: 31 32 30                -                         120
sparrow@io:/tmp$ hex test3.txt 
0x00000000: 31 32 30 0a             -                         120J
Echo schreibt also tatsächlich einen Zeilenumbruch.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

uuh, uh, cool!

also du meinst einfach

Code: Alles auswählen

open("/proc/stb/video/plane/psi_brightness","w").write("140\n")
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Nee, ich meine das schon mit dem with-block. Das ist sehr viel weniger fehleranfällig.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

ok, werd ich probieren müssen, denn mit nem \n funktionierts schonmal nicht. gibt nen segmentation fault.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

könnte es auch sein, dass 140 zu gross ist und nur Werte bis zu einer gewissen Grösse Möglich sind?
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Nein, daran kanns nicht liegen, weil ich ja die Werte per echo alle schreiben kann.

Ich frag mich aber, ob es ein Rechteproblem ist. Also ob eventuell das System den Zugriff der Pythondatei reglementiert, denn die psi_dateien sind ja Systemdateien.
Eventuell gibts da einen Konflikt.

Denn wenn ich das Python-Skript nun eine Shell aufrufen lasse, dann kommts auch zum Segmentation fault.

Ich glaub also mittlerweile, dass ich da ein Zugriffs/Rechteproblem habe.
lunar

@mocca: Mit Sicherheit handelt es sich nicht um ein Rechteproblem. Fehlende Rechte äußern sich nicht in Speicherzugriffsverletzungen, sondern in "normalen" Fehlermeldungen. Auch ist es vollkommen irrelevant, dass sich die betreffenden Dateien in "/proc/" befinden. "/proc/" ist zwar ein besonderes Dateisystem, die darin befindlichen Dateien sind aus Sicht des Systems dennoch normale Dateien. So etwas wie „Systemdateien“ im Sinne einer besonderen Behandlung bestimmter Dateien gibt es unter Linux nicht.

Es besteht auch kein Unterschied zwischen "echo 140 > datei" und "with open('datei', 'w') as stream: stream.write('140\n'". In beiden Fällen gelangen exakt dieselben Werte in die Datei. Insofern ist es unwahrscheinlich, dass der Fehler bei Python zu suchen ist, falls tatsächlich abweichende Resultate beobachtet werden.

Das nur als Anmerkung, mehr kann ich dazu nicht sagen, da mir insbesondere nicht klar ist, was Du mit „Dateien geben einen Segfault zurück“ meinst. Die Erläuterung, dass "cat" bei der Anzeige dieser Dateien mit einer Speicherzugriffsverletzung abstürzt, ist nicht schlüssig, da in diesem Fall lediglich "cat" betroffen wäre. Das System selbst friert nicht ein, nur weil ein einzelnes Programm abstürzt.

Insofern würde ich Dich bitten, eine etwas präzisere Fehlerbeschreibung zu geben. Zeige bitte den exakten Quelltext, der zum Auftreten dieses Problems führt (und zwar 1:1 so wie Du ihn ausführst), und die (ebenfalls exakte) Ausgabe von "cat" beim Auslesen der Dateien. Wenn das System tatsächlich "einfriert", handelt es sich dann um einen Kernel Panic?
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Das ganze läuft auf einem Linux-Satelliten-Receiver.

Ich will das in einen MediaPlayer einbauen, damit der die Werte beim Aufruf des MediaPlayer anpasst.

Baue ich also diesen Schreibvorgang (egal ob von Python geschrieben oder Python ruft ein ShellSkript mit dem echo > Datei auf) in diesem MediaPLayer ein, sodass dieser beim Öffnen ausgeführt wird, dann bleibt das System hängen, weil die psi-Dateien nicht mehr lesbar sind.

Sobald diese Dateien nicht mehr lesbar sind kann das System nichts mehr anzeigen, weil ohne die Dateien keine Bildausgabe möglich ist. Deshalb sag ich, das System hängt sich auf.

Ich kann natürlich per Telnet weiterhin drauf zugreifen. Bekomme aber so oder so einen Segmentation Fault.

An Rechte oder ähnliches dachte ich jetzt, weil wenn ich per cat die Werte auslese, bekomme ich Werte.
Wenn ich per FTP die Dateien kopieren und öffnen will, dann sind die Dateien leer.

So hatte ichs ursprünglich probiert:

Code: Alles auswählen

class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, InfoBarSubtitleSupport, HelpableScreen):
	ALLOW_SUSPEND = True
	ENABLE_RESUME_SUPPORT = True

	def __init__(self, session, args = None):
		Screen.__init__(self, session)
		InfoBarAudioSelection.__init__(self)
		InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions")
		InfoBarNotifications.__init__(self)
		InfoBarBase.__init__(self)
		InfoBarSubtitleSupport.__init__(self)
		HelpableScreen.__init__(self)
		self.summary = None
		self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
		self.session.nav.stopService()
		open("/proc/stb/video/plane/psi_brightness","w").write("140\n")
		open("/proc/stb/video/plane/psi_contrast","w").write("120\n")

		self.playlistparsers = {}
		self.addPlaylistParser(PlaylistIOM3U, "m3u")
		self.addPlaylistParser(PlaylistIOPLS, "pls")
		self.addPlaylistParser(PlaylistIOInternal, "e2pls")
.
.
.

lunar

Verzeihe mir, doch unter präzise und exakt verstehe ich anderes, es bestehen immer noch Unklarheiten.

Wenn das System sich aufhängt, und keine Bildschirmausgabe mehr möglich ist, woher weißt Du dann, dass es sich tatsächlich um einen Segfault handelt?!

Lass doch den ganzen Quelltext drum herum erst einmal weg, schreibe ein minimales Python-Skript, welches diese Dateien beschreibt, und prüfe, führe es aus, und prüfe, ob das funktioniert. Und zwar am besten erst nach einem Neustart des Systems, und ohne zuvor irgendwie anderweitig auf diese Dateien zuzugreifen.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

ok, werd ich machen.

Ich weiss, dass es ein Segfault ist, weil wenn ich den MediaPlayer aufrufe und einen Dauerspinner bekomme (Dauer-Sanduhr), verbinde ich vom Computer mit Telnet und dann kann ich ja mit cat versuchen die Dateien zu lesen. Und da kommt der Fehler.

Ich werd mal probieren müssen, ob ein Plugin, das nur die Werte ändert funktioniert. Wenn nicht, werde ich mal ein py-Skript schreiben, dass nicht vom System als Plugin geladen wird, sondern dass ich sozusagen als Standalone aufrufe.

Neustart ist zwischen den Tests übrigens immer nötig, denn wenn einmal der Dauerspinner kommt geht eh nix mehr ohne Neustart.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Ich hoffe du schließt die beiden Dateien auch irgendwann wieder in die du die Daten geschrieben hast?

Und versuch doch mal den Inhalt irgend einer anderen Datei mit 'cat' ausgeben zu lassen wenn es bei den bei dir besprochenen Dateien nicht funktioniert.

Vielleicht ist das Problem eher da angesiedelt.

Gruß
sparrow
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mocca hat geschrieben:Ich weiss, dass es ein Segfault ist, weil wenn ich den MediaPlayer aufrufe und einen Dauerspinner bekomme (Dauer-Sanduhr), verbinde ich vom Computer mit Telnet und dann kann ich ja mit cat versuchen die Dateien zu lesen. Und da kommt der Fehler.
Und wie leitest du daraus ab dass das Skript segfaultet? Weil das was du aufgezählt hast sind alles nicht Sachen die eindeutig auf einen Segfault schließen lassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

weil mir im telnet dann angezeigt wird "segmentation fault" ;)
Antworten