ioctl() löscht Rücksprungadresse
-
Hallo,
Beim lesen der seriellen Schnittstelle erhalte ich einen Segmentation Fault. Ich arbeite mit gcc. Programm kompiliert ohne Fehler und Warnung.
Ich konnte den falschen Speicherzugriff auf einen ioctl-Command in einer Funktion einschränken. Sämmtliche schreibende ioctl's auf die gleiche Schnittstelle vorher funktionierten ohne Problem.
Im Debugger kann ich folgenden Trace verfolgen:
main()->i2c_outbyte()->i2c_getbit()
Vor dem ioctl ist die Rücksprungadresse auf die Main-Funktion in Ordnung. Nach dem ioctl()-Aufruf fehlt die Rücksprungadresse auf die main()-funktion. Bei Rückkehr aus der Funktion i2c_outbyte() ergibt sich ein Segmentation Fault.
unsigned int i2c_getbit(void) { unsigned short status; int debug=ioctl(serialfd, TIOCMGET, &status); // Nach diesem Aufruf ist die Rücksprung-Adresse weg status= status & 4; // get the CTS = Staus & TIOCM_CTS if (status == 4) return 1; else return 0; //return }
serialfd ist ein gültiger globaler Device-File handler.
Vielen Dank für die Hilfe.
-
Hallo,
Problem gelöst, ich habe eine zu kleine Rückgabe-Variable (16Bit anstelle 32Bit) an ioctl() übergeben.
mit
unsigned int
geht's ohne das die Rücksprungadresse mit dem ioctl-Ergebnis überschrieben wird ;-).
schönes Weekend