PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : File Descriptor öffnen



nina
10-10-2008, 11:43
Hallo zusammen,
ich versuche ein file descriptor in ein C programm zu öffnen, ich kriege immer die Meldung:segmentation fault.
Das file descriptor ist ein Bash-Skript, das ich im mnt/flash gespeichert.
mit dem Befehl:
desc = open("/mnt/flash/Skript.sh",O_RDONLY); bekomme ich diese Meldung.

Kann jemanden mir sagen, was ich falsche mache.

Danke

ContainerDriver
10-10-2008, 11:57
Hallo,

kannst du mal bitte den kompletten Quellcode posten? Stürzt das Programm wirklich beim Öffnen der Datei ab (nachprüfbar mit gdb, dabei muss das Programm mit dem Schalter -g kompiliert werden)?

Gruß, Florian

nina
10-10-2008, 12:46
Hallo

hiermit schicke ich das Programm.

Danke

undefined
10-10-2008, 14:04
Open zeigt auf einen nicht Deklarierten Zeiger "desc"
PS: das ist ein Programm gehört nach C-Coding ;)

ContainerDriver
10-10-2008, 16:51
Open zeigt auf einen nicht Deklarierten Zeiger "desc"
PS: das ist ein Programm gehört nach C-Coding ;)

Doch, der ist schon deklariert (als globale Variable), andernfalls würde ja auch der Compiler meckern.

@tina: bei mir läuft das Programm ohne Probleme durch, am besten du versuchst es mal auf deinem System mit gdb zu debuggen.

locus vivendi
10-10-2008, 18:33
Hallo zusammen,
ich versuche ein file descriptor in ein C programm zu öffnen, ich kriege immer die Meldung:segmentation fault.
Das file descriptor ist ein Bash-Skript, das ich im mnt/flash gespeichert.
Dein Programm, welches du weiter unten gepostet hast, verzichtet an wichtigen Stellen auf Fehlerüberprüfung. Als Faustregel kannst du dir merken, dass das Resultat aller Funktionsaufrufe die schiefgehen können abgefragt werden sollte. Speziell würde ich dir raten, zu überprüfen, ob tcgetattr in der initport Funktion erfolgreich ist.

Hier ist meine Hypothese was schiefläuft:
1. In initport wird tcgettattr aufgerufen.
2. tcgettattr liefert einen Fehler zurück, weil "/dev/ttyS1" kein gültiger Port (Terminal) ist.
3. Weil tcgetattr schiefläuft, wird die termios Struktur "options" nicht vollständig initialisiert.
4. Später werden uninitialisierte Teile von "options" gelesen, z.B. durch einen cfsetispeed oder tcsetattr Aufruf. Und das liefert dann den Segmentation Fault.

Andere Sprachen als C machen solche Fehler unwahrscheinlicher. In C++ könnte man z.B. die Erzeugung des "termios" Objektes mit dem tcgetattr Aufruf bündeln, in einer Weise die automatisch abläuft. Dann kann man dafür sorgen, dass ein uninitialisiertes Objekt gar nicht erst zurückbleibt.

P.S.: Woher stammt eigentlich die getbaud Funktion? Von hier: http://www.captain.at/howto-simple-serial-port-test-example.php?
Es ist meistens eine gute Idee ein komplettes Beispiel zu posten, so dass man nicht erst Teile zusammen suchen muss.

P.P.S.: Wenn du Speicherfehlern auf die Schliche kommen willst, ist neben einem Debugger wie dem bereits erwähnten Gdb auch Valgrind sehr nützlich.

locus vivendi
10-10-2008, 18:40
Mist, vergessen zu erwähnen - mindestens eine printf Aufruf sieht mir auch sehr zweifelhaft aus. Irgendwo wird da versucht ein einzelnes Zeichen als String auszugeben.

Und was ich evtl. auch noch einmal überprüfen würde (ich behaupte also nicht das es falsch wäre, nur das ich mir unsicher bin), ist die Null im fcntl Aufruf. Müsste da nicht eigentlich eine symbolische Konstante hin (wie O_APPEND, O_ASYNC, O_DIRECT, ...)? Vielleicht kann ja jemand anderes weiterhelfen.