2011-08-12 10 views
3

私のC++コードからsystemをLinuxプログラムに呼びたいが、最初にプログラムがユーザのマシンにインストールされているかどうかを確認したい。プログラムがLinuxにインストールされているかどうかをC++で判断する

Ubuntuでは、そのプログラムに関連付けられたパッケージが、dpkg -s gifsicleのようなシステムコールを使用してインストールされ、その出力を解析するかどうかを判断できます。 gifsicleはここにプログラム名です。

ただし、プログラム(例:gifsicle)がソースからコンパイルされている可能性があり、Ubuntuパッケージリポジトリに表示されない可能性があります。

C++コードを実行しているシステムでプログラム(例:gifsicle)を使用できるかどうかをプログラムで確認するにはどうすればよいですか?

答えて

2

Linux用の標準パッケージマネージャはありませんので、dpkgは間違った答えです。

セキュリティと正確性の理由から、実行可能ファイルを見つけるためにユーザーのPATHに頼っているのはおそらく賢明ではありません。したがって、systemへの電話では、すでに完全なパス(例:/usr/bin/gifsicle)を使用しているはずです。

はもしそうなら、あなたの質問に簡単に答えは:

if (access("/usr/bin/gifsicle", X_OK) == 0) { 
    system("/usr/bin/gifsicle -my -args"); 
} 
else if (errno == EACCESS) { 
    /* gifsicle not found */ 
} 
else { 
    /* access() failed! Operating system is broken or Windows (or both) */ 
} 

(ボーナスポイントは、変数に/usr/bin/gifsicleを置く場合)

難しい - しかし、間違いなく「より正確」 - 答えsystemを避けてfork + execlとし、execlを確認してENOENTまたはそれに類するものかどうかを確認してください。しかし、障害を親プロセスに伝えることは迷惑になることがあります。

4

最初にwhichを呼び出すことができます。

終了ステータスは、パス上で指定された実行可能ファイルが見つかるかどうかを示します。

-2

あなたはconfigureスクリプト(または類似)を作成しようとしているように聞こえる

は、プログラムを手動でインストールされているとに登録されていない場合をカバーするために、autoconfの

基本的に

http://www.linuxselfhelp.com/gnu/autoconf/html_chapter/autoconf_3.html

+1

彼は条件付きビルドをしようとしていない。彼は環境のランタイムチェックを望んでいます。 –

1

を見ますインストールされたパッケージデータベースを使用する場合は、プログラムがインストールされていないことを保証するためにファイルシステム全体をスキャンする必要があります。

プログラムがユーザーのPATHにあることが確かであれば、コマンド(system()も使用)を呼び出すことができます。

しかし、これに対する一般的な解決方法は、ユーザーが構成オプションを使用して実行可能ファイルへのパスを上書きできるようにすることです。たとえば、Doxygenは、図を生成するためにドットを呼び出すように構成することができます。デフォルトでは、それはPATH環境変数上にあるようにdotを呼び出そうとします。見つからない場合は、dotプログラムが見つからないことと、DOT_PATHの設定値が設定されていないことをユーザに警告します。この解決策は、他のシステムでも簡単にで動作するという利点があります。

+1

マイナーニックピック: "リポジトリ"とは通常、ローカルにインストールされたものではなく、ネット上で利用可能なすべてのパッケージのコレクションを意味します。 –

+0

@Tomalak:代わりに "インストールされたパッケージデータベース"を使用しました。 –

+0

それははるかに良いです:D –

0

あなたが言うように、何かがインストールされているかどうかを判断することは自明ではありません。本当に、「インストール済み」という明確な定義はありません。パッケージマネージャは近づくが、すべてがパッケージマネージャを通過するわけではない。

なぜ単に実行可能ファイルを呼び出そうとしないのですか?呼び出しが失敗し、systemが実行ファイルが見つからないことを示す場合は、インストールされていないか、または利用できないと仮定してください。—どちらが問題になりますか? —と代替代替に移行してください。

関連する問題