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 popenund Weise zu tun, wie Sie mit dem Rest Ihres Programms interagieren. popenmuss 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/nullSie den String, an den Sie übergeben, einschließen , popenda er von der Shell interpretiert wird.
Und popenerstellt einen untergeordneten Prozess. Wenn Sie selbst etwas mit Signalverarbeitung oder Gabelungsprozessen anfangen, erhalten Sie möglicherweise seltsame SIGCHLDSignale. Ihre Aufrufe zu waitinteragieren möglicherweise seltsam mit popenund 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, popenda diese Zeichenfolge direkt shmit ü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 popenkeine niedrige Sprache ist. Und weil die Verwendung von popenBereichen 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.