• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Globale Variable in C

leanUX

Member
Hallo,
ich habe ein Problem mit der Programmiersprache C.

Es geht darum, eine globale Variable in mehreren Quelltextdateien
zu benutzen.
Hier mal ein Demo-Beispiel rund um die Variable "myGlobal", um zu
verdeutlichen was ich meine:

Code:
/* --------------- Datei file1.c -----------------*/
#include <stdio.h>

int myGlobal;       /* Definition einer globalen Variablen */  

extern func2(void); /* Verweis auf eine extern definierte Funktion */  
extern func3(void); /* Verweis auf eine extern definierte Funktion */  
int main(void)
{
  myGlobal=1;
  printf("myGlobal (in main): %d\n", myGlobal);  
  func2();               /* ändere myGlobal */  
  printf("myGlobal (in main, nach func2): %d\n", myGlobal);  
  func3();  
  func2();  
  printf("myGlobal (in main, nach func3 und func2): %d\n", myGlobal);  

  return 0;
}/* -------------- Ende Datei file1.c -------------*/


/* --------------- Datei file2.c -----------------*/
#include <stdio.h>

extern int myGlobal; /* Verweis auf extern definierte  
                        globale Variable */  
void func2(void)  
{  
  printf("myGlobal (in func2) %d\n", myGlobal);  
  myGlobal++;  
}/* -------------- Ende  Datei file2.c ------------*/


/* --------------- Datei file3.c -----------------*/
#include <stdio.h>

extern int myGlobal; /* Verweis auf extern definierte  
                        globale Variable */  

void func3(void)  
{  
  printf("myGlobal (in func3) %d\n", myGlobal);  
  myGlobal++;  
}/* -------------- Ende  Datei file3.c ------------*/

Compilieren und Testen:
-----------------------
leanUX@linux:~/prog/C/test> gcc -o testglobal file1.c file2.c file3.c
leanUX@linux:~/prog/C/test> ./testglobal
myGlobal (in main): 1
myGlobal (in func2) 1
myGlobal (in main, nach func2): 2
myGlobal (in func3) 2
myGlobal (in func2) 3
myGlobal (in main, nach func3 und func2): 4

Wie man sieht funktioniert das Beispiel genau so wie es soll.

Das eigentliche Problem stellt sich jetzt, wenn ich dies bei einem groesseren Projekt
versuche. Und zwar habe ich vor, die Sourcen des sshd etwas anzupassen, um eine
zweistufige Passwortabfrage einzubauen. Am einfachsten ist es hierzu u.a. globale (integer)
Status-Variablen zu verwenden. Das Verrueckte ist nun, wenn ich wie im obigen Demo-Beispiel
globale Variablen einfuehre, dann werden die (per "extern" importierten) Variablen in den
anderen Quelltextdateien zwar richtig gelesen, d.h. der richtige Wert wird per "debug" ausgegeben,
egal auf welchen Wert sie vorbelegt wurden.
Ich kann die Variable auch veraendern, und die veraenderte Variable _gleich_ per debug ausgeben,
aber nur solange sich alles in der selben Quelltextdatei abspielt.
Sobald aber Code aus einer anderen Quelltextdatei ausgefuehrt wird, sind dort die zuvor
durchgefuehrten Veraenderungen an der globalen Variablen unwirksam geworden, sie hat wieder den
Wert der Vorbelegung.

Hat jemand eine Idee weshalb hier das Veraendern der globalen Variablen nicht funktionieren will?
Ich habe (aus Verzweifelung) schon "volatile" probiert, auch habe ich, um nicht irgend einem
Make-Fehler auzusitzen, alle Dateien per "touch" aufs gleich Datum gebracht, alle *.o-Dateien
geloescht und alles neu compiliert; leider ohne Erfolg.

Also fuer einen Tipp waere ich wirklich dankbar.
 

abgdf

Guru
Hi,
ich habe ein Problem mit der Programmiersprache C.
Wer nicht ? :)

Bitte lies über Header-Dateien und Module; und dann auch gleich über Objekt- und Bibliotheksdateien (da das große Programm wahrscheinlich damit arbeitet).

Viele Grüße
 
OP
L

leanUX

Member
Hallo abgdf,

vielen Dank für die Antwort, habe ich inzwischen gemacht. Ich habe aber keine Informationen gefunden die mir aufzeigen wo das Problem liegt. Nach wie vor scheint aus meiner Sicht eigentlich kein Fehler im Quelltext vorzuliegen.

Falls Du aber einen bestimmten Tipp haben solltest worauf ich hier achten muss dann wäre es nett wenn Du etwas konkreter darauf eingehen könntest. (Wie Du siehst habe ich in dem Demo-Prograemmchen ja gezeigt dass ich generell weiss wie mit Modul-uebergreifenden Variablen umzugehen ist :p)

Gruß
leanUX
 

ralf13

Newbie
Hallo,
nachdem du die Variable erflogreich ändern kannst, würde ich darauf tippen, dass entweder wird deine Initalisierungsfunktion erneut durchlaufen wird oder es mehrere Variablen dieses Namens gibt (z.B. noch eine lokale in deiner Funktion, such' doch mal nach dem Namen und überprüf alle Vorkommen)

Gruß,
Ralf
 
OP
L

leanUX

Member
Hallo ralfl3,

vielen Dank für den Hinweis.
Ich habe zwar noch keine Lösung für mein Problem, aber ich weiß nun immerhin weshalb die globale Variable _anscheinend_ nicht Modul-übergreifend verändert werden kann. Das Problem liegt grundsätzlich daran, dass der sshd, solange der user noch nicht durch sein korrektes Passwort authentifiziert ist, weitere Instanzen von sich forkt. In meinem Code wird die globale Variable zu dieser Zeit dann in der einen Instanz verändert, die andere Instanz kriegt davon natürlich so ohne Weiteres nichts mit.
 

abgdf

Guru
Hallo leanUX,

so gut weiß ich auch nicht bescheid :(, aber ich könnte mir eben vorstellen, daß man das in größeren Projekten nicht mit mehreren .c-Dateien, sondern mit einer zentralen .h-Datei macht.

Das mit den weiteren Prozessen könnte natürlich auch sein, aber das kann ich wohl eher nicht überprüfen ...

Viele Grüße
 
OP
L

leanUX

Member
Hi abgdf,

mit den header-Dateien ist alles korrekt, auch im großen sshd-Projekt.
Schau mal was ich oben an ralfl3 geschrieben habe, das Problem liegt grundsätzlich daran, dass der Prozess sich forkt.

Viele Grüße
 

abgdf

Guru
Ok, aber da kannst Du wohl kaum erwarten, daß wir hier Deine projektspezifischen Probleme mit sshd nachvollziehen und lösen.
 
OP
L

leanUX

Member
Hi abgdf,

ist schon klar. Als ich die Frage eingestellt hatte bin ich noch davon ausgegangen, dass irgend etwas mit den Modul-übergreifenden Variablen nicht stimmt. Nachdem ich erkannt habe, dass es grundsätzlich am forken liegt, habe ich das hier auch nur deshalb gepostet damit sich keiner mehr Gedanken um mögliche Probleme mit den globalen Variablen macht.
Danke nochmal für die Hilfen.
 
Oben