wolfgang bauer (D) <
sch...@gmx.de> schrieb:
>
> Hallo
>
> Ich arbeite hier unter Linux (Cinnamon).
>
> Als ich einen Starter für eines meiner Programme (ein
> Konsolenprogramm) anlegte, vergaß ich, die Terminal-Option zu
> aktivieren.
> Nach Start erschien natürlich nichts, aber mein Programm lief
> "unsichtbar" und verbrauchte 100% CPU.
> Ich fand dann heraus, das es an einer Warteschleife liegt,
> welche per fgets bzw. scanf auf eine Eingabe wartet.
Prinzipiell ist es gute Praxis in C, sich die Rückgabewerte von
Eingabefunktionen anzuschauen und entsprechend zu reagieren,
wenn was nicht stimmt.
Andere Sprachen brechen bei missingender Eingabe mit Fehler ab,
aber die I/O - Funktionen von C schieben die ganze Verantwortung
auf dem Programmierer. Muss man nicht mögen, aber wenn man C
verwendet, sollte man sich drauf einstellen.
Eine Schleife in der From
/* Irgendwann muss der User doch mal was vernünftiges eingeben... */
while (scanf(...) == 0)
;
ist halt bei EOF oder einer Fehlerbedingung eine Endlosschleife.
> Es scheint, das wenn das entspr. Programm NICHT mit einer Konsole
> gestartet wurde, diese Eingabefunktionen direkt zurückkehren und
> das Programm also in einer Endlosschleife festhängt.
Sie geben dann 0 bzw NULL zurück.
> Frage: Wie kann ich feststellen, ob mein Programm mit oder ohne
> Konsole gestartet wurde ?
Innerhalb der C-Norm: Gar nicht. Innerhalb von POSIX: isatty().
Aber willst du tatsächlich, das das Programm nur interaktiv
funktioniert und z.B. nicht aus einer Datei oder von einer Pipe
gefüttert werden kann? Hat dein Anwendungsfall Besonderheiten,
die nur interaktive Ausführung interessant machen?