Ihre Frage schien nach einer Waldantwort zu verlangen, und die Antworten hier scheinen wie Baumantworten zu sein. Ich dachte, ich würde Ihnen eine Waldantwort geben.
So werden C-Programme sehr selten geschrieben. Es ist immer so, wie Shell-Skripte geschrieben werden und manchmal, wie Python-, Perl- oder Ruby-Programme geschrieben werden.
Die Benutzer schreiben in der Regel in C, um die Systembibliotheken einfach zu verwenden, auf OS-Systemaufrufe zuzugreifen und die Geschwindigkeit zu erhöhen. Und C ist eine schwierige Sprache, in der man schreiben kann. Wenn die Leute diese Dinge nicht brauchen, dann benutzen sie kein C. Außerdem wird von C-Programmen normalerweise nur erwartet, dass sie von gemeinsam genutzten Bibliotheken und Konfigurationsdateien abhängen.
Das Ausschalten eines Unterprozesses ist nicht besonders schnell und erfordert keinen feinkörnigen und kontrollierten Zugriff auf Systemeinrichtungen auf niedriger Ebene. Daher ist die Abhängigkeit von einer externen ausführbaren Datei möglicherweise überraschend in C-Programmen.
Es gibt einige zusätzliche Bedenken. Die Sicherheits- und Portabilitätsbedenken, die die Leute erwähnen, sind vollständig gültig. Sie sind natürlich auch für Shell-Skripte gültig, aber die Leute erwarten solche Probleme in Shell-Skripten. Es wird jedoch normalerweise nicht erwartet, dass C-Programme diese Art von Sicherheitsbedenken haben, was sie gefährlicher macht.
Aber meiner Meinung nach haben die größten Bedenken mit der Art popen
und Weise zu tun, wie Sie mit dem Rest Ihres Programms interagieren. popen
muss einen untergeordneten Prozess erstellen, dessen Ausgabe lesen und dessen Beendigungsstatus erfassen. In der Zwischenzeit wird dieser Prozess 'stderr mit demselben stderr wie Ihr Programm verbunden, was zu verwirrenden Ausgaben führen kann, und sein stdin entspricht dem Ihres Programms, was zu anderen interessanten Problemen führen kann. Sie können das lösen, indem </dev/null 2>/dev/null
Sie den String, an den Sie übergeben, einschließen , popen
da er von der Shell interpretiert wird.
Und popen
erstellt einen untergeordneten Prozess. Wenn Sie selbst etwas mit Signalverarbeitung oder Gabelungsprozessen anfangen, erhalten Sie möglicherweise seltsame SIGCHLD
Signale. Ihre Aufrufe zu wait
interagieren möglicherweise seltsam mit popen
und schaffen möglicherweise seltsame Rennbedingungen.
Die Sicherheits- und Portabilitätsbedenken sind natürlich da. Wie für Shell-Skripte oder alles, was andere ausführbare Dateien auf dem System startet. Und Sie müssen darauf achten, dass Benutzer Ihres Programms keine Shell-Metazeichen in die Zeichenfolge einfügen können, in die Sie übergehen, popen
da diese Zeichenfolge direkt sh
mit übergeben wird sh -c <string from popen as a single argument>
.
Aber ich denke nicht, dass sie der Grund dafür sind, warum es seltsam ist, ein C-Programm zu verwenden popen
. Der Grund, warum es seltsam ist, ist, dass C in der Regel eine niedrige Sprache und popen
keine niedrige Sprache ist. Und weil die Verwendung von popen
Bereichen das Design Ihres Programms einschränkt, weil es seltsam mit den Standardeingaben und -ausgaben Ihres Programms interagiert und es Ihnen schwer macht, Ihr eigenes Prozessmanagement oder Ihre eigene Signalverarbeitung durchzuführen. Und weil von C-Programmen normalerweise keine Abhängigkeiten von externen ausführbaren Dateien erwartet werden.