problem mit globaler variable



  • hallo,

    dieser folgende code ausschnitt zeigt ein globales array gl_childs und 2 Funktionen, die mit dieser Variablen arbeiten.

    Zuerst wird store_child_id() aufgerufen und verschiedene IDs in dem Array abgelegt.
    Irgendwann gegen Ende des Programmes wird dann send_signal_to_childs() aufgerufen und das Array sollte eigentlich durchlaufen werden (egal ob vorwärts oder rückwarts, hier: rückwärts) um die IDs durchzulaufen.

    PROBLEM:
    es wird ständig folgendes ausgegeben (hier als Bsp: 2 Ids), wenn send_signal_to_childs() ausgeführt wird:

    send: 2
    -- 0
    -- 0

    ABER die Ausgabe von store_child_id() sieht so aus:

    id: 5281
    store: 5281
    childs: 1
    id: 5282
    store: 5282
    childs: 2

    gl_childs_counter zähle ich an anderer Stelle hoch. Hier habe ich kein Problem mit der Globalität der Variable.
    Wieso bleiben die Werte nicht im globalen Array gespeichert? Hat was was damit zu tun, weil es ein Array ist?

    int gl_childs[MAX_CLIENTS]; /* array of child ids */
    
    void send_signal_to_childs(void)
    {
    	int i;
    
    	printf("send: %d\n", gl_childs_counter);
    
    	for(i = 1; i <= gl_childs_counter; i++)
    	{
    		printf("-- %d\n", gl_childs[gl_childs_counter-i]);
    		//kill(gl_childs[i], SIGUSR1);
    
    	}
    }
    /**
    * stores a child id in array
    * @param int id process id of server child
    * @return void
    */
    void store_child_id(int id)
    {
    	printf("id: %d\n", id);
    	gl_childs[gl_childs_counter-1] = id;
    	printf("store: %d\n", gl_childs[gl_childs_counter-1]);
    	printf("childs: %d \n", gl_childs_counter);
    }
    


  • das riecht verdaechtig nach http://de.wikipedia.org/wiki/Um-eins-daneben-Fehler

    und was machst du eigentlich mit gl_childs_counter?



  • hallo,

    nein daran liegt es nicht. Ich habe aus dem Array mal eine einfache Variable gemacht, somit sollte der zuletzt zugewiesene Wert ausgegeben werden, aber es wird der Anfangswert ausgegeben, OBWOHL in store_child_id() die Variable doch eindeutig überschrieben wird!

    id: 5454
    store: 5454
    childs: 1
    send: 1
    -- 1

    int gl_childs = 1; /* array of child ids */
    
    void send_signal_to_childs(void)
    {
    	int i;
    
    	printf("send: %d\n", gl_childs_counter);
    
    	for(i = 1; i <= gl_childs_counter; i++)
    	{
    		printf("-- %d\n", gl_childs);
    		//kill(gl_childs[i], SIGUSR1);
    
    	}
    }
    /**
    * stores a child id in array
    * @param int id process id of server child
    * @return void
    */
    void store_child_id(int id)
    {
    	printf("id: %d\n", id);
    	gl_childs = id;
    	printf("store: %d\n", gl_childs);
    	printf("childs: %d \n", gl_childs_counter);
    }
    

    PS: gl_childs_counter bestimmt wie oft meine for Schleife durchlaufen werden muss.



  • Dann greifst Du in den beiden Funktionen auf unterschiedliche gl_childs zu (evtl. Definition im Header statt Deklaration?)



  • Im Übrigen gibt's das Wort 'childs' nicht, die Mehrzahl von 'child' ist 'children'. Nur so, nicht dass du dich noch lächerlich machst 😉



  • @Lord
    nein, ich definiere genau einmal.

    @GPC
    oh danke! Das ist wirklich peinlich...



  • argh...ich hab den Fehler gefunden. Es lag am fork()...die IDs habe ich im CASE vom Kindprozess gespeichert...was natürlich trotz Globalität keine Auswirkung auf die globale Variable im Elternprozess hat. Daher war die immer unverändert.


Anmelden zum Antworten