GCC optimiert Endlosschleife weg



  • Hallo an alle,

    ich habe folgenden Code:

    while(1)
    {
    	printf("Hallo");
    	select(readsocket + 1, &descriptor, NULL, NULL, NULL);
    
    	if (FD_ISSET(readsocket, &descriptor))
    	{
    		//...
    	}
    }
    

    Leider wird nun "Hallo" nur einmal ausgegeben bzw. nach jedem Empfangenem Paket. Wie kann ich das verhindern? Optimierung ist schon ausgeschaltet, vielleicht irgendeine andere Sicherheitsfunktion? Benutze den GCC, ich glaube aktuellster Version. Ein Sleep(1) hat auch nichts gebracht (was in jedem Fall angebracht wäre).
    Brauche das damit ein Server Programm von sich aus alle paar Sekunden ein Paket sendet.

    Falls jemand den Kompletten Source braucht:
    http://github.com/Jermuk/custom_cs2dsrv
    Zu finden in der src/main.c

    Vielen Dank für das Lesen!

    Gruß Jermuk



  • Leider wird nun "Hallo" nur einmal ausgegeben bzw. nach jedem Empfangenem Paket.

    Ja was erwartest du denn anderes? So sollte es doch sein, wenn dein Codeausschnitt stimmt.



  • select() ist doch blockierend?! (Zumindest mit timeout=NULL)
    D.h. select() kehrt nur zurück wenn was empfangen wurde, sonst wartet es.
    Also ist für mich das Verhalten völlig normal.



  • in src/map.c solltest du den Typ der Variablen, die fgetc Werte speichern von unsigned char zu int wechseln.

    int ReadInt(FILE *file)
    {
    	int byte1 = fgetc(file);
    	if (byte1 == EOF)
    		error_exit("EndOfFile in ReadInt()\n");
    
    	int byte2 = fgetc(file);
    	if (byte2 == EOF)
    		error_exit("EndOfFile in ReadInt()\n");
    
    	int byte3 = fgetc(file);
    	if (byte3 == EOF)
    		error_exit("EndOfFile in ReadInt()\n");
    
    	int byte4 = fgetc(file);
    	if (byte4 == EOF)
    		error_exit("EndOfFile in ReadInt()\n");
    
    	return (byte4 << 24) | (byte3 << 16) | (byte2 << 8) | byte1;
    }
    

    laut man-page werden die Daten zwar als unsigned char aber zu int oder EOF gecastet. Ich finde es dehalb besser int grundsätzlich zu verwenden.



  • scrontch schrieb:

    select() ist doch blockierend?! (Zumindest mit timeout=NULL)
    D.h. select() kehrt nur zurück wenn was empfangen wurde, sonst wartet es.
    Also ist für mich das Verhalten völlig normal.

    Autsch!
    An so etwas einfaches hatte ich nicht gedacht! Werde Timeout runter setzten!
    Vielen Dank auch Supertux! Ich werde das so machen!



  • Du musst überhaupt erstmal einen Timeout übergeben.


Anmelden zum Antworten