linux-l: linux und C

tho at thomsen.isdn.cs.tu-berlin.de tho at thomsen.isdn.cs.tu-berlin.de
Sa Mär 13 15:26:26 CET 1999


In message <Pine.SOL.3.91.990313001041.7581B-100000 at elf.cs.tu-berlin.de>, Chris
tof Lutteroth writes:
> Hi !
> Ich habe da ein Programm geschrieben und will einen Teil davon in 
> eine andere Datei auslagern und getrennt compilieren. 
loeblich.

> Ich habe jetzt eine funcs.c Datei mit den ausgelagerten Funktionen und
> eine funcs.h Datei mit den Prototypen der Funktionen, die von aussen 
> benutzt werden koennen sollen. Die funcs.h habe ich in meine Hauptdatei 
> main.c inkludiert und alle Files mit gcc -c ... zu Objektfiles uebersetzt.
> Danach mit gcc gelinkt.
> Das hat ja alles geklappt, aber jetzt funktioniert die Ausgabe (auf den 
> Bildschirm), die einige meiner ausgelagerten Funktionen machen sollten, 
> nicht mehr. Trotz vieler printf's tut sich auf dem Bildschirm nix, wenn 
> ich mein Programm starte. Was hab ich da falschgemacht ?
 Die Vorgehensweise ist wohl ok. Versuch einmal die option -Wall dem gcc beim
kompilieren mitzugeben. Eventuell erfahren wir dann mehr.

 Aehm, ich will Dir das jetzt nicht unterstellen, aber ich habe schon mal je-
manden gesehen (Name soll jetzt nicht genannt werden), der sein Hello-World
Programm mit dem KDE Filemanager startete (ca. 2-3 dutzend Mal ;-) und immer
noch nichts sah. Stdout muss natuerlich eingesehen werden. Entweder umleiten
oder von der shell aus starten.

 BTW: Stdout wird gepuffert und u.U. terminiert dein Programm bevor die Puffer
weggeschrieben wurden. Fuege ein fflush(NULL) an das Programmende ein, ggf, auch ein sleep(1). Eigentlich sollte dies nicht noetig sein, denn exit() schliesst
 alle Streams aber ich habe schon gegenteillige Erfahrung gemacht.


> 
> Und dann noch etwas:
> Ich hab auch Zufallszahlen mit rand() in meinem Proggi, und bei 
> mehrmaligem starten waren es immer wieder dieselben, die er mir gegeben hat.
Ja, gut, genau wie `man 3 rand` beschrieben. 

> Wie kann ich das auf elegante Weise aendern ? 
Am einfachsten aber eben auch kryptographisch nicht sicher, ist es die aktuelle
Systemzeit (evtl. noch kombinert mit der PID) srand() zu uebergeben. So erhaelts
Du (mit grosser Wahrscheinlichkeit) bei jedem Programmstart eine andere Sequenz
von Pseudozufallszahlen.

> da gibt es doch so etwas 
> wie einen "random seed" im Linux-System, oder ?
Wirklich zufaellige Werte kannst Du aus dem 'random' geraet auslesen. Dort
stehen aber nicht beliebig viele Werte zur Verfuegung und Du musst u.U. lange
auf den naechsten Wert warten. Die Werte dort stammen aus dem 'Entropiee-pool',
der mit (mutmasslich) zufaelligen Ereignissen (z.B. Keyboard-, Mouseinterrupt)
gefuellt wird. Wenn, z.B. auf servern ohne console, niemand an der Mouse 
ruettelt dauert es halt eine Weile bis genuegend Zufaellige Ereignisse statt-
fanden, um einen weiteren Wert zu berechnen.

Das 'urandom' Geraet stellt einen Kompromiss zwischen der rand() funktion und
dem random Geraet dar. Wenn nicht genuegend zufaellige Ereignisse stattfanden,
das random Geraet also (vorrueberhegend) keinen Wert liefern kann, liefert
urandom pseudo-zufallszahlen.

Guenther



Mehr Informationen über die Mailingliste linux-l