あなたの質問は森の答えを求めているようで、ここでの答えは木の答えのように見えるので、私はあなたに森の答えをあげると思いました。
これは、Cプログラムがどのように記述されるかということは非常にまれです。それは常にシェルスクリプトの記述方法であり、時にはPython、perlまたはRubyプログラムの記述方法でもあります。
人々は通常、システムライブラリを簡単に使用し、OSシステムコールに低レベルで直接アクセスするため、および速度のためにCで記述します。また、Cは書くのが難しい言語なので、人々がそれらを必要としない場合、Cを使用しません。また、Cプログラムは通常、共有ライブラリと構成ファイルにのみ依存することが期待されます。
サブプロセスへのシェルアウトは特に高速ではなく、低レベルのシステム機能へのきめ細かく制御されたアクセスを必要とせず、外部実行可能ファイルへの驚くべき依存性を導入するため、参照することはまれですCプログラム。
いくつかの追加の懸念事項があります。人々が言及したセキュリティと移植性の懸念は完全に有効です。もちろん、シェルスクリプトにも同様に有効ですが、人々はシェルスクリプトにこの種の問題を期待しています。しかし、Cプログラムは通常、この種のセキュリティ上の懸念があるとは考えられていないため、より危険になります。
しかし、私の意見では、方法に関する最大の懸念はpopen
、プログラムの他の部分と相互作用することです。popen
子プロセスを作成し、その出力を読み取り、終了ステータスを収集する必要があります。その間、そのプロセスのstderrはプログラムと同じstderrに接続され、混乱を招く可能性があり、そのstdinはプログラムと同じであり、他の興味深い問題を引き起こす可能性があります。これは、シェルによって解釈される</dev/null 2>/dev/null
ためpopen
、渡す文字列に含めることで解決できます。
そしてpopen
、子プロセスを作成します。シグナル処理または分岐プロセスで自分で何かを行うと、奇妙なSIGCHLD
シグナルを受け取ることになります。への呼び出しは、奇妙な競合状態とwait
奇妙に相互作用しpopen
、場合によっては作成する可能性があります。
もちろん、セキュリティと移植性の問題があります。シェルスクリプトなど、システム上の他の実行可能ファイルを起動するためのものです。そして、あなたはあなたのプログラムを使用して、人々はあなたに渡す文字列にシェルのメタcharcatersを取得することができないことに注意する必要がありpopen
、その文字列が直接与えられているので、sh
とsh -c <string from popen as a single argument>
。
しかし、私はそれらがCプログラムを使用して見ているのは奇妙だとは思わないpopen
。奇妙な理由は、Cは通常低レベルの言語であり、低レベルでpopen
はないためです。popen
場所の使用はプログラムの制約を設計するため、プログラムの標準入出力と奇妙に相互作用し、独自のプロセス管理や信号処理を行うのが面倒になるからです。また、Cプログラムは通常、外部実行可能ファイルに依存することを期待されていません。