2017-06-21 12 views
1

タイトルに情報を取得する必要があります。私は以下の変数へのsysctl呼び出しを行い、KERN_VERSION、KERN_OSVERSION、KERN_TYPE、KERN_RELEASEという他の(有用ではない)情報(通常はカーネルに関するものではない)を私に与えました。MacOS用のC/C++で製品名/バージョンを取得する方法(つまり「Mac OS」と「10.12.5」を取得する)

sw_versのソースコードを参照してください:https://opensource.apple.com/source/DarwinTools/DarwinTools-1/sw_vers.cと私は自分のコンピュータを含むことができたが、私はそれを実装するためcoulnd'tを実装することを試みた。私の/ include /ディレクトリを見ると、/ CoreFoundation /が見つからないので、どこから取り出しているのかわかりません。

私はC/C++を使ってこれをどのように得ることができますか?

おかげ

+0

あなたは多くの研究をしていませんか? KERN_VERSIONがsys/sysctl.hで定義されていることを知るために30秒で1つのGoogle検索が必要でした。おそらく、この同じヘッダに定義された 'sysctl_rdstring'を使ってあなたをどこかに連れて来るでしょう。 –

+0

10.12.5はmacOS Sierraのバージョンで、macOS部分の異なる大文字小文字を使用しています。 –

+0

@MichaëlRoy:あなたはポイントを逃したと思う - OPはそれらについて知っているが、彼らは求められている答えを提供していない。 –

答えて

1

これは私のプロジェクトだったら、私は単にsw_versユーティリティを起動し、その出力を解析します。あなたはこれを実現するためにpopenを使用することができ、以下に例示する:

char buf[1024]; 
unsigned buflen = 0; 
char line[256]; 
FILE *sw_vers = popen("sw_vers", "r"); 
while (fgets(line, sizeof(line), sw_vers) != NULL) { 
    int l = snprintf(buf + buflen, sizeof(buf) - buflen, "%s", line); 
    buflen += l; 
    assert(buflen < sizeof(buf)); 
} 
pclose(sw_vers); 

は、関連する情報を取得するために、出力を解析します。私のシステムでは、出力は次のようになります。

ProductName: Mac OS X 
ProductVersion: 10.12.5 
BuildVersion: 16F73 

だから、あなたが示すように、バッファにすべてを保存するのではなく、それぞれの行を解析できます。

情報がプログラムに格納されると、結果がキャッシュされます。今後同じプログラムでクエリを実行すると、sw_versを再度呼び出すのではなく、キャッシュされた結果を使用できます。

関連する問題