Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ C / C++ (ANSI-Standard) » system is bad

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
22.10.2004, 11:13 Uhr
virtual
Sexiest Bit alive
(Operator)


Warum system schlecht ist

(Bitte bei Bedarf ergänzen)

Im folgenden möchte ich einige Gründe vorstellen, die gegen die Verwendung von system sprechen. Dafür ist es notwendig, sich klar zumachen, was system eigentlich macht. Die landläufige Meinung ist, daß folgender Code

C++:
system("pause");


das Programm pause ausführt. Das ist schlicht und ergreifend falsch: jeder, der den Inhalt seiner festplatte kennt, wird feststellen, daß dieses Programm garnicht existiert. Abgesehen davon, das PAUSE nur etwas ist, was unter Windows - wie auch immer - funktioniert, wird vergeblich nach ein pause.exe, pause.com oder pause.bat auf seiner Windowsplatte suchen.
Warum wartet aber das eigene Programm dennoch auf einen Tastendruck? - Nun: system führt nicht das Programm pause aus, sondern dem Kommandozeileninterpreter des jeweilen Betriebssystems und übergibt den String pause diesem Kommandozeileninterpreter.
Unter Windows ist der Kommandozeileninterpreter das Programm, welches in der Environmentvariable COMPSPEC definiert ist; unter UNIX entsprechend das Programm, welches mit der Environmentvariable SHELL definiert ist.

1. Nachteil
Damit wären wir schon mal beim ersten Nachteil der Funktion system: Man hat eigentlich keine Garantie, was ausgeführt wird, weil der Anwender die Umgebungsvariable ja beliebig davor umgesetzt haben könnte. Daß dies ein massives Sicherheitsrisiko ist, dürfte klar sein.

Desweiteren geht system hin und führt nun also den Kommandozeileninterpreter mit dem Kommando aus, welches wir angegeben haben, währenddessen ruht die Ausführung unseres eigenen Programms:

2. Nachteil
Man nimmt also einen kompletten Kontrolverlust des eigenen Programms in kauf, vertraut daß das andere Programm schon wohl das machen wird, was wir vermuten; daß es derart fehlerfrei ist, daß es garantiert zurückkommt. Unter Linux kann ich diese Haltung zwar nachvollziehen: ist ja bekanntlich total bugfrei, stürzt niemals ab und alle Programme sind von unfehlbaren Programmierern geschrieben ( ), aber unter Windows ist eine solche Annahme mehr als gewagt.

"Ja, ja", mag der geneigte Leser denken, "unser virtual war schon immer paranoid". Dem kann ich nur entgegenen, daß mir das schon oft dem Kopf gerettet hat... Aber nichts desto trotz, nehmen wir an, daß alle Programme auf dem Rechner total fehlerfrei wären (was ja schon an sich eine ziemliche Utopie ist):

3. Nachteil
Es kann sein, daß das Programm garnicht da ist. Das eingangs erwähnte pause gibts zB nur bei Windowsstandardinstallationen; unter UNIX erstmal nicht. Auch so beliebte Tricks unter Windows eine "bmp" Datei aufzurufen fallen in die gleiche Kategorie: niemand garantiert, daß die Verknüpfung für eine "bmp" Datei so gesetzt ist, wie man auf dem Entwicklungs oder Testrechner eingesetzt hat. Siehe auch Nachteil 1. Generell begibt man sich mit system nicht nur in die Plattformabhängigkeit, sondern sogar noch viel weiter in die Installationsabhängigkeit...


Speziell unter richtigen Betriebssystemen (Da fällt mir eigentlich nur BSD, Linux, UNIX et.al. ein) gibt es häufig "restricted environments", also Umgebungen, in dem ein User nur ein begrenztes Maß an Resourcen zur Verfügung hat. Beliebt ist zB die Anzahl der Prozesse zu begrenzen: versucht ein Programm einen weiteren zu starten, wird dies kurzerhand nicht erlaubt:

4. Nachteil
system birgt die Gefahr, daß die Operation nicht ausgeführt wird, selbst wenn die og Nachteile nicht zählen: irgendein quota oder eine sonstige Restriction wirds schon im unangenehmsten Augenblick richten, daß das Programm, welches system starten soll, überhaupt nicht losgeht.

"Alles Mumpitz", sagt da jemand, "ich will doch nur den Bildschirm löschen, bzw. auf eine Taste warten!" - Das ist nicht kritisch. Mein gegenargument:

5. Nachteil
Du willst den Bildschirm löschen? - Warum tust du es dann nicht einfach? - Wenn Du system startest, startest Du mindestens einen, vielleicht sogar zwei zusätzliche Programme, nimmst die og Nachteile in Kauf, aber bist Dir immer noch nicht sicher, ob der Bildschirm wirklich leer ist. Jedes Betriebssystem hat API Funktionen, um den Bildschirm zu löschen. Die sind genauso unportabel, wie das, was man system als Parameter mitgibt - nur eben schnell, sicher und risikofrei!. Meistens genügt übrigens auch eine einfach printf Anweisung, um den Bildschirm zu löschen...
Du willst auf einen Tastendruck warten? - Warum tust du es nicht einfach? - Argumentation wie oben...

Fazit
1. Für Trivialaufgaben verbietet sich system völlig, weil das Betriebssystem trivialaufgaben besser lösen kann, als zwei Prozesse starten und hoffen, daß das korrekte passiert.
2. Für komplexere Aufgaben verbietet sich system völlig, weil man keine Kontrolle mehr über das hat, was passiert.
3. Für portable Programm verbietet sich system völlig, weil system nicht portabel ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 22.10.2004 um 13:11 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.10.2004, 11:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


um auch mal für system ne lanze zu brechen...
wenn man mal nur zum testen was schnell zusammen hacken will kann es doch sehr brauchbar sein, weil es einem unter anderem helfen könnte mit wenig auffwand sich auf das zu konzentrieren was man machen will...
wenn man was verkaufen will oder was baut was auch andere nutzen soll ist es dann halt nicht geeignet....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.10.2004, 11:35 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich verschiebs nochmal ins ANSI C Forum, um das gepflegt auszudiskutieren
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.10.2004, 11:37 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf
das ist IMHO kein wirkliches Argument: weil die entsprechende bestriebsssystemspezifische Lösung (zB für Pause) schreibt man sich genau einmal, verwendet sie danach wieder, indem man eine Library dazu linkt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.10.2004, 11:44 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also ich habe system bisher auch für andere sachen benutzt als "pause"...
system("pause"); kann ich auch durch ein einfaches einlesen von einer variablen erreichen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.10.2004, 11:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Für was benutzt du denn system so?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.10.2004, 12:20 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Für was benutzt du denn system so


top secret
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.10.2004, 12:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ohne jetzt genauer drauf eingehen zu wollen ich brauchte z.b. mal eine konverter als teil meins proggies und den gabs als exe schon fertig... bevor ich mich da selber dran gemacht habe hab ich die exe mit system so lange benutzt weil das hauptproblem nicht war den konverter zu schreiben sondern ein anderes...
um den konverter hab ich mich erst gekümmert nachdem ich das andere hinbekommen hatte, von dem ich nicht mal wusste ob ich das überhaupt hinbekommen würde...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.10.2004, 12:38 Uhr
virtual
Sexiest Bit alive
(Operator)


@Windalf
Auch hier hätte ich Dir eher zu einem CreateProcess geraten...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.10.2004, 12:39 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@virtual
alleine das Create hat schon genauso viele Buchstaben wie das system
und dann muss ich ja wieder dumme header einbinden und mir die parameter von createProcess überlegen um das ganze am ende dann wieder zu kicken...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 22.10.2004 um 12:40 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ FAQ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: