6

コマンドラインプログラムを呼び出すか、ライブラリを利用することで実現できる、開発中のアプリケーションに必要な機能があるとします。効率が問題ではないと仮定すると、ライブラリを利用するのではなく、単にプログラムをシステムコールするのは悪い習慣ですか?これを行うことの欠点は何ですか?

より具体的に言うと、このシナリオの例は、Webサーバーからファイルをダウンロードする必要があるアプリケーションです。これには、cURLプログラムまたはlibcURLライブラリのいずれかを使用できます。

4

8 に答える 8

10

1つのOSのみのコードを記述していない限り、システムコールが機能するかどうかを知る方法はありません。システムアップデートまたはOSアップグレードがあるとどうなりますか?同じ機能を実行するライブラリがある場合は、システムコールを使用し
ないでください。

于 2009-02-04T01:49:07.660 に答える
3

依存関係の問題があるため、ライブラリを好みます。つまり、実行可能ファイルを呼び出したときに実行可能ファイルが存在しない可能性がありますが、ライブラリは存在します(プラットフォームでプロセスが開始されるときに外部ライブラリ参照が処理されると想定しています)。言い換えると、ライブラリを使用すると、システムコールよりも多くの環境で、より安定した予測可能な結果が保証されるように見えます。

于 2009-02-04T01:40:22.827 に答える
3

考慮すべきいくつかの要因があります。重要なのは、ソフトウェアがインストールされているすべてのシステムに外部プログラムが存在するかどうかの信頼性です。欠落する可能性がある場合は、プログラム内で実行することをお勧めします。

それと比較すると、プログラムにロードされる余分なコードは法外なものであると考えるかもしれません。アプリケーションのこのようなめったに使用されない部分にコードの膨張は必要ありません。

system()関数は便利ですが、危険です。特に、通常はシェルを呼び出すためです。プログラムをより直接的に呼び出す方がよい場合があります。Unixでは、fork()およびexec()システムコールを使用します。[ちなみに、システムコールは関数の呼び出しとは大きく異なることに注意してくださいsystem()!] OTOH、プログラム内の開いているすべてのファイル記述子が閉じられていることを確認する必要がある場合があります。特に、プログラムが他のプログラムの代わりに実行されているデーモンの場合はそうです。ユーザー; 特別な特権を使用していない場合はそれほど問題にはなりませんが、呼び出されたプログラムに意図しないものへのアクセスを許可しないことをお勧めします。fcntl()システムコールとFD_CLOEXECフラグを確認する必要がある場合があります。

一般に、プログラムに機能を組み込むと、物事の制御を維持するのが簡単になりますが、それは簡単な決定ではありません。

于 2009-02-04T01:51:08.857 に答える
2

セキュリティは1つの懸念事項です。悪意のあるcURLは、プログラムに大混乱を引き起こす可能性があります。これがコーディング速度が主な焦点である個人的なプログラムなのか、セキュリティなどが重要な要素となる商用アプリケーションなのかによって異なります。

于 2009-02-04T01:29:22.410 に答える
1

ええ、上記のように、システム コール (fcntl() や open() など) と system() コールの違いに注意してください。:)

ac プログラムのプロトタイピングの初期段階では、popen() を使用してファイルを操作するために、grep や sed などのプログラムを外部から呼び出すことがよくあります。安全ではなく、安全ではなく、確かに移植性がありません。しかし、それはあなたがすぐに始めることを可能にすることができます. それは私にとって価値があります。これにより、プログラムの本当に重要なコア、通常は最初に c を使用した理由に集中できます。

高水準言語では、かなりの正当な理由が必要です。:)

于 2009-02-04T02:23:56.903 に答える
0

Other's have mentioned good points (reliability, security, safety, portability, etc) - but I'll throw out another. Performance. Generally it is many times faster to call a library function or even spawn a new thread then it is to start an entire new process (and then you still have to correctly check/verify it's execution and parse it's output!)

于 2011-05-18T04:38:51.130 に答える
0

どちらかを行う代わりに、コマンド ライン引数と stdin を使用して、Unix を作成し、アプリの周りにスクリプト フレームワークを構築します。

于 2009-02-04T03:14:21.047 に答える