2011-10-19 12 views
0

私はコード(.cファイル)で私はどのようにLinuxの配布名のバージョン(ubuntu 10.0.4、またはcentOS 5.5 ...)? 私が探しているc関数は、カーネルのバージョンを取得するために(.cファイル)で使われるuname()システムコールのようなものでなければなりません。 この関数はすべてのLinuxディストリビューション(標準)のために働いていることが分かります
私は、コマンドラインlinuxをコード(.cファイル)から使用して、 ( "cat/etc/リリース"))。私はどのようにLinuxディストリビューションの名前のバージョンを見つけることができます

ご意見をお寄せください。

よろしく

+0

fopen/fread経由で/ etc/releaseを読み込むのはいかがですか? – Vinzenz

答えて

0

いくつかのシェルコマンドを実行することはできますか?

$ /usr/bin/lsb_release -r 
Release:  11.04 

$ /usr/bin/lsb_release -d 
Description: Ubuntu 11.04 

$ /usr/bin/lsb_release -rd 
Description: Ubuntu 11.04 
Release:  11.04 
1

さて、あなたは(とすべきである)/etc/releaseを読み取るため、代わりにsystem("cat")fopenfgetsを使用することができます。

普遍的な方法はありませんが、私はファイルシステムを全く持たない(initramfsを除く)Linuxイメージを構築することもできます。

+0

aixの答えについての私のコメントを参照してください。例えば、私のArchは '/ etc/release'を持っていません。 – cnicutar

+0

@cnicutar:私の答えの後半を読んでください。 –

+0

これは有効な点ですが、私は同意します:-) – cnicutar

1

あなたはfopen("/etc/lsb-release")であり、その内容を解析できます。それは次のようになります。

DISTRIB_ID=Ubuntu 
DISTRIB_RELEASE=10.04 
DISTRIB_CODENAME=lucid 
DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS" 

このメソッドは普遍的ではありません。あなたが気にしているすべてのディストリビューションで動作することを確認する必要があります(そうでなければ、私はあなたに@ott - の答えを伝えることをお勧めします)。

+0

いいですが、これは多くのディストリビューションでは失敗します(たとえば、これはArchでは動作しません)。本当の答えは '/ etc'構造体、initフレーバー、パッケージマネージャーなどを見て見つけることができます。 – cnicutar

1

AFAIK uname(2)が十分な情報を提供していない場合、これを取得するための標準システムコールはありません。
おそらく "/ proc/version"をチェックし、それを読むことです

3

まだこれについての標準はありません。以下のファイルを問い合わせたり、存在を確認したりすることができます:

/etc/lsb-release 
/etc/issue 
/etc/*release 
/etc/*version 
+0

+1は素晴らしいリストと免責事項です。 – cnicutar

+0

標準がないだけでなく、配布物が名前を持つ必要はありません(少なくとも、システム自体では、誰かがソースコードを提供しなければなりません) –

0

これを行うための移植可能な方法はありませんが、OS検出ツール/ライブラリを使用する必要があります。

幸いにも、そこにはいくつかあります。私はそれらの2を知っている:

(私は人形を経由してfacterを使用し、それ)非常に良いです。

少し追加のスクリプトを使用すると、これらのプログラムの出力の1つを使用して、コード内で使用できる.hを生成できます。

この世代をメイクファイルのステップとして統合することもできます。

0

私は通常、/ etc/issueを検査します。 (他の人が指摘するように)それは保証されていませんが、私は信頼性の高い分野に取り組んできました。 私が経験した限り、それはubuntu、debian、redhat、centos、slackware、archlinuxで動作します。

関連する問題