Ist es schlechte Praxis das System zu benutzen () Funktion, wenn Bibliotheksfunktionen stattdessen verwendet werden könnten? Warum?

StackOverflow https://stackoverflow.com/questions/509743

  •  21-08-2019
  •  | 
  •  

Frage

Sagen Sie es eine Funktionalität für eine Anwendung in der Entwicklung benötigt wird, ist die, indem sie einen Systemaufruf, um entweder ein Kommandozeilen-Programm oder die Verwendung einer Bibliothek erreicht werden konnte. Unter der Annahme, Effizienz ist kein Problem, ist es eine schlechte Praxis, einfach einen Systemaufruf an ein Programm zu machen, anstatt eine Bibliothek nutzen? Was sind die Nachteile, dies zu tun?

Um die Dinge zu konkretisieren, ein Beispiel für dieses Szenario wäre eine Anwendung, die eine Datei von einem Webserver heruntergeladen werden muß, entweder das cURL-Programm oder die libcURL Bibliothek könnte dafür verwendet werden.

War es hilfreich?

Lösung

Wenn Sie Code schreiben für nur ein Betriebssystem, gibt es keine Möglichkeit zu wissen, ob Ihr Systemaufruf wird auch funktionieren. Was passiert, wenn es ein System-Update oder ein Betriebssystem-Upgrade?
Nie einen Systemaufruf verwenden, wenn es eine Bibliothek ist die gleiche Funktion zu tun.

Andere Tipps

Ich ziehe Bibliotheken wegen des Abhängigkeitsproblems, nämlich die ausführbare Datei möglicherweise nicht da sein, wenn Sie es nennen, aber die Bibliothek wird (vorausgesetzt, externe Bibliothek Referenzen darauf geachtet werden, wenn der Prozess auf Ihrer Plattform startet). Mit anderen Worten, Bibliotheken scheinen ein stabiles, berechenbares Ergebnis in mehr Umgebungen als Systemaufrufe gewährleisten würde.

Es gibt mehrere Faktoren zu berücksichtigen. Ein Schlüssel ist die Zuverlässigkeit, ob das externe Programm vorhanden sein, wird auf allen Systemen, in denen die Software installiert ist. Wenn es eine Möglichkeit gibt, dass es fehlen wird, dann ist es vielleicht besser, es in Ihrem Programm zu tun.

Mit einem Gewicht dagegen, könnte man bedenkt, dass der zusätzliche Code geladen in Ihr Programm unerschwinglich ist - Sie müssen nicht den Code aufblähen für eine solche selten genutzte Teil Ihrer Anwendung

.

Die System () Funktion ist bequem, aber gefährlich, nicht zuletzt, weil es eine Shell aufruft, in der Regel. Sie können besser dran, das Programm mehr direkt aufrufen - auf Unix, über die fork () und exec () Systemaufrufe. [Beachten Sie, dass ein Systemaufruf aus dem Aufruf der system() Funktion ist ganz anders, übrigens!] OTOH, können Sie über die Gewährleistung aller geöffneten Dateibeschreibungen in Ihrem Programm kümmern müssen geschlossen werden - vor allem, wenn Ihr Programm ist eine Art Dämon im Namen des Laufens andere Benutzer; das ist weniger ein Problem, wenn Ihr nicht besondere Privilegien verwenden, aber es ist immer noch eine gute Idee, nicht das aufgerufene Programm Zugriff auf alles geben Sie hatte nicht die Absicht. Sie können an dem fcntl() Systemaufruf und die FD_CLOEXEC Flagge suchen.

Im Allgemeinen ist es einfacher, die Kontrolle über die Dinge zu behalten, wenn Sie die Funktionalität in Ihr Programm zu bauen, aber es ist keine triviale Entscheidung.

Die Sicherheit ist ein Anliegen. Ein böswilliger cURL könnte Chaos in Ihrem Programm führt. Es hängt davon ab, ob dies ein persönliches Programm ist, wo Geschwindigkeit Codierung Ihr Schwerpunkt ist, oder eine kommerzielle Anwendung, wo Dinge wie Sicherheit einen Faktor spielen.

Systemaufrufe sind viel schwieriger zu sicher zu machen.

Alle Arten von lustigen Charakteren müssen richtig codiert werden passieren Argumente, und die Art der Codierung von Plattform oder sogar Version des Befehls kann variieren. So ein System Anruf, dass alle Benutzerdaten überhaupt enthält erfordert viel geistige Gesundheit Kontrolle und es ist leicht, einen Fehler zu machen.

Ja, wie oben erwähnt, halten die Differenz zwischen Systemaufrufen (wie fcntl () und open ()) und System () ruft im Auge behalten. :)

In den frühen Stadien ein C-Programm Prototyping, oft ich externe Anrufe an Programmen wie grep machen und sed zur Manipulation von Dateien mit popen (). Es ist nicht sicher, es ist nicht sicher, und es ist sicherlich nicht tragbar. Aber es kann dir erlauben, schnell in Gang zu bringen. Das ist wertvoll für mich. Es lässt mich auf die wirklich wichtigen Kern des Programms konzentrieren, in der Regel der Grund, warum ich verwendet c an erster Stelle.

In Hochsprachen, sollten Sie besser haben einen ziemlich guten Grund. :)

Statt entweder zu tun, würde ich Unix es auf und ein Skript Rahmen um Ihre App bauen, die Befehlszeilenargumente und stdin verwenden.

Anderen haben gute Punkte erwähnt (Zuverlässigkeit, Sicherheit, Sicherheit, Portabilität, etc.) - aber ich werde eine andere wegzuwerfen. Performance. Generell ist es ein Vielfaches schneller ist eine Bibliotheksfunktion aufrufen oder sogar einen neuen Thread erzeugen dann einen ganz neuen Prozess zu starten ist (und dann muss man noch richtig überprüfen / verifizieren sie die Ausführung ist und analysieren es Ausgabe!)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top