Da Sie ein Windows-exklusives Programm erstellen, warum sind Anrufe zu system()
so gehasst? Seit ich angefangen habe in C++ zu programmieren, habe ich "Do not Touch System" etwas sehr viel gehört. Ich habe diesen Grundsatz gehorsam befolgt, aber was ist daran so schlimm?Was ist so schlimm an System()?
Antwort
Was Sie in den Systemaufruf eingeben, hängt davon ab, auf welchem Betriebssystem Sie das Programm ausführen. Es ist also komplett nicht portabel. Außerdem können viele Dinge schiefgehen, da Sie einfach einen Befehl in die Leere werfen und hoffen, dass alles gut geht. Fehlerbehandlung (zum Beispiel - das Programm, das Sie ausführen möchten, existiert nicht, oder PATH ist nicht richtig eingestellt, oder Sie haben keine Berechtigungen, etc.) ist sehr schwer oder sogar unmöglich.
Abgesehen davon, wie in den Kommentaren die meiste Zeit (wirklich "am meisten", wie 99,999%) bemerkt, gibt es keine Notwendigkeit, system
zu verwenden.
"So ist es komplett nicht tragbar." System(""); sieht für mich ziemlich tragbar aus – user1233963
std::system()
erfordert, dass Sie dem Befehl vertrauen, um das zu tun, was Sie wollen. Sie haben keine Möglichkeit zu überprüfen, ob diese Annahme gerechtfertigt ist. Zum Beispiel kann ein ungewöhnlicher Wert für die Umgebungsvariable PATH dazu führen, dass ein anderes Programm als in der Standardkonfiguration ausgeführt wird.
Das Verhalten eines Anrufs an std::system()
ist systemabhängig. Auch wenn die Anforderung im Moment ist, dass die Anwendung nicht auf einem anderen Betriebssystem ausgeführt werden muss, kann sich diese Anforderung ändern. Wenn man bedenkt, dass std::system()
oft für Zwecke verwendet wird, die portabler (insbesondere von Anfängern) erreicht werden können, ist die Einführung einer Plattformabhängigkeit hier nicht erforderlich.
system()
ruft den Befehlsinterpreter des Betriebssystems als separaten Prozess auf. Mehr als oft nicht, gibt es native APIs, um das gleiche Ergebnis direkt innerhalb des aufrufenden Prozesses und mit mehr Kontrolle darüber zu erreichen.
- 1. Was ist so schlimm an xsl: for-each?
- 2. Ist C++ explizite Konvertierung wirklich so schlimm?
- 3. Wie schlimm ist die WPF-Lernkurve?
- 4. Was ist System :: String-Konstruktorcodierung?
- 5. Was ist so toll an Block Auswahlmodus?
- 6. Was ist so schwer an P2P Lochung?
- 7. Timeout Pattern - Wie schlimm ist Thread.Abort wirklich?
- 8. Wie schlimm ist es, Ajax ohne jQuery zu machen?
- 9. Was ist Taggable_id für in Tagging-System?
- 10. Was ist in Java das 'System-Standardpaket'?
- 11. Was ist ein CSS-Grid-System?
- 12. Wie schlimm ist es, Javascript außerhalb der Kopfzeile zu setzen?
- 13. Zusammengesetzte Strategie Muster - Java - Wie schlimm ist dieser Code?
- 14. Was ist so schlecht an der Verwendung von SQL INNER JOIN
- 15. Die Verwendung von statischer statt parcel/serialize - ist das schlimm?
- 16. Was ist falsch an meinem ADO.NET-Code?
- 17. Was ist das Besondere an Verschlüssen?
- 18. Was ist System aus, println in System.out.println() in Java
- 19. an system() oder fork()/exec()?
- 20. Was ist das beste Open-Source-Help-Ticket-System?
- 21. Was ist nativer Absturz bei /system/lib/libc.so?
- 22. Versteck eines versteckten Elements ... Wie schlimm?
- 23. Was ist das Besondere an Generic.xaml?
- 24. Was ist falsch an diesem Rettungsbeispiel?
- 25. Was ist falsch an der folgenden Methode?
- 26. Was ist die Entsprechung/dev/shm in Windows System?
- 27. Was ist ein gutes Templating-System für PHP?
- 28. Was ist der Unterschied zwischen Platten- und Buddy-System?
- 29. Was ist die niedrigste SDK-Version, die natives System unterstützt?
- 30. Was ist falsch an diesem regulären Ausdruck?
Plus, sind die Dinge, die Menschen neigen dazu, in 'System()' einfügen sind in der Regel nur so dumm, wie das Löschen des Bildschirms oder pausiert. Es wird eher als fauler und suboptimaler Weg verwendet, etwas zu tun, das im tatsächlichen Code viel besser wäre. –
Wenn Sie es falsch machen und unsanitierte Benutzereingaben weitergeben, öffnen Sie Ihre Anwendung, um Injektionsschwachstellen zu steuern. Ein Angreifer kann beliebige Befehle mit denselben Berechtigungen wie Ihre Anwendung ausführen. –
Mach was du willst, wenn du weißt, was du tust. – deepmax