2012-01-03 12 views
5

ISO CもPOSIXも、実行時に基礎となるOSを決定する機能を提供していません。理論的な観点からは、Cは最も一般的なシステムコール用のラッパーを提供しており、ニッチピッキングの観点からはになる必要はありません。 OSです。実行時にOSを決定する

しかし、多くの現実のシナリオでは、Cが共有しようとしているホスト環境よりも多くのことをホスト環境について知ることが有益であることが証明されています。設定ファイルをどこに保存するか、またはselect()を呼び出す方法を知るためには、

実行時に基礎となるOSを判断するためにC言語で書かれたアプリケーションの慣用方法がありますか?

少なくとも、Linux、Windows、BSD、MacOSのどちらを簡単に決定できますか?

私の現在の推測は、C:\/などの特定のファイル/ディレクトリの存在を確認することですが、この方法は信頼性が低いようです。たぶん一連のそのようなソースを照会することは、「OSフィンガープリント」という概念を確立するのに役立ち、信頼性を向上させる可能性があります。とにかく、私はあなたの提案を楽しみにしています。

+11

のEr、あなたはコンパイル時にこの情報を知っているあなたは*実行*ヘルプでOSを決定どのよう –

+0

'select()'コールを正しく書くか? –

+0

+1、@David。少なくともLinuxとWindows、Mac OS Xなどの違いについては、私はランタイムの方法でそれぞれのバージョンの違いを区別する必要があると思いますが、OPが探しているものかもしれませんが、その答えはそれぞれに固有のものですオペレーティングシステム、おそらく。 –

答えて

5

実際には、ほとんどのシステムには現在使用中のカーネルを示すunameコマンドがあります。 Mac OSでは、これは通常 "Darwin"ですが、Linuxではそれは単なる "Linux"です.Windowsでは "ERROR"であり、FreeBSDは "FreeBSD"を返します。

More complete list of uname outputs

あなたはsystem()

+0

あなたは私にそれを打つ。 – rsaxvc

+0

私はあなたのすべてを打ち負かすように見える:-) –

+0

@Tom Windowsではどうなるのですか?すべてのCコンパイラのために? –

2

を必要としませんので、私はあなたがPOSIXシステム上にある場合は、(のunameを呼び出すことができ、unameのためのC当量がありますことをかなり確信している)から<sys/utsname.h>

これは明らかに100%移植性がありませんが、実行時にそれを許可できる方法はないと思います。

は詳細

1

ランタイムがこれを決定するための時間ではないためthe man pageを参照して、壮大なクラッジせずに、1つのプラットフォーム用のバイナリが別の上で実行されませんということで、あなただけのプラットフォームに敏感なコードの周り#ifdef Sを使用する必要があります。

+2

-1という質問は、実行時にオペレーティングシステムを判断する方法についての質問であるため、実行する必要があるかどうかは関係ありません。 – Ataraxia

+0

ええ、それはOPを助けるものではありません。 _VAST_の大半の場合、FreeBSD用に生成されたオブジェクトは、とにかくLinux上では動作しません(これは彼のケースの大半を占める)。 – richo

-2
if (strchr(getenv("PATH"),'\\')) 
    puts("You may be on windows..."); 

がでも私は「ランタイムがこれを決定するための時間ではありません...」ということに同意します

関連する問題