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


Anmelden zum Antworten