Seite 1 von 2

Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 21:48
von mocca
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?

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 21:52
von Hyperion
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?

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 21:58
von mocca
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. :?:

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:11
von Hyperion
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.ä.?

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:18
von mocca
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.ä.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:23
von Hyperion
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.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:33
von mocca
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

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:40
von sparrow

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.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:53
von mocca
uuh, uh, cool!

also du meinst einfach

Code: Alles auswählen

open("/proc/stb/video/plane/psi_brightness","w").write("140\n")

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 22:58
von sparrow
Nee, ich meine das schon mit dem with-block. Das ist sehr viel weniger fehleranfällig.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Dienstag 8. Februar 2011, 23:05
von mocca
ok, werd ich probieren müssen, denn mit nem \n funktionierts schonmal nicht. gibt nen segmentation fault.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Mittwoch 9. Februar 2011, 19:43
von DaMutz
könnte es auch sein, dass 140 zu gross ist und nur Werte bis zu einer gewissen Grösse Möglich sind?

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Mittwoch 9. Februar 2011, 21:10
von mocca
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.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Mittwoch 9. Februar 2011, 21:28
von 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?

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Mittwoch 9. Februar 2011, 21:44
von mocca
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")
.
.
.


Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Mittwoch 9. Februar 2011, 21:53
von 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.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Mittwoch 9. Februar 2011, 22:50
von mocca
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.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Donnerstag 10. Februar 2011, 09:05
von sparrow
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

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Donnerstag 10. Februar 2011, 09:26
von Leonidas
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.

Re: Segmentation fault bei Schreiben in Dateien

Verfasst: Donnerstag 10. Februar 2011, 10:11
von mocca
weil mir im telnet dann angezeigt wird "segmentation fault" ;)