8

ISO C も POSIX も、実行時に基盤となる OS を判別する機能を提供していません。理論的な観点からは、C は最も一般的なシステム コールのラッパーを提供するため問題ではありませ

ただし、多くの現実世界のシナリオでは、ホスト環境について、C が喜んで共有するよりも多くのことを知ることが役立つことが証明されています。たとえば、構成ファイルを保存する場所や を呼び出す方法を見つけるために、次のようになりますselect()

C で記述されたアプリケーションが実行時に基盤となる OS を判別する慣用的な方法はありますか?

少なくとも、Linux、Windows、BSD、および MacOS のどれかを簡単に判断できますか?

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

4

5 に答える 5

7

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

uname出力のより完全なリスト

に相当する C があると確信しているunameので、必要はありませんsystem()

于 2012-01-03T01:28:23.947 に答える
4

POSIXシステムを使用している場合は、から uname() を呼び出すことができます<sys/utsname.h>

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

詳細については、man ページを参照してください

于 2012-01-03T01:30:09.003 に答える
1

ランタイムはこれを決定するときではありません。あるプラットフォームの壮大な応急修理のバイナリが別のプラットフォームでは実行されないため#ifdef、プラットフォームに依存するコードの周りでsを使用する必要があります。

于 2012-01-03T02:00:55.863 に答える