-1

OS X で最もメモリを集中的に使用するアプリケーション* の名前を取得する必要があります。サード パーティの API の使用を控えながら、ソリューションは Objective-C である必要があります。ソリューションに解析を含めることはできません。

*アプリケーションのメモリ強度は、そのアプリケーションが使用している実メモリの量として定義できます。

4

3 に答える 3

3

使用sysctl可能なプロセスを取得するために使用できます。SOの質問「現在iPhoneとiPadで実行されているアプリケーションを取得できますか?」には、macOSで機能するはずの答えがあります…Xcode 4.4の新しいmacOSプロジェクトの答えにコードを入れるだけで、#importing and running結果の配列を返すのではなくNSLogを実行すると、収集されたプロセス名とIDの配列がきちんと表示されます。

そこには豊富な情報がstruct kinfo_procあり、ネストされstruct extern_procていますが、残念ながら、個々のプロセスのメモリ情報を取得する簡単な方法はわかりません。

libtop.cそのためには、 Appleのオープンソース製品であるを参照することができます。リンクされたバージョンはMacOSX10.8ライブラリからのものです。

いずれにせよ、sysctlから利用可能なプロセスをプルすることとlibtop.cのプロセス情報検索コードを組み合わせると、探しているものを正確にプログラムするソリューションになります。

そして…一方…これが必要とする作業と比較して非常に小さな構文解析を行うことを気にしない場合は、SOの答えを試してください。NSTaskを使用できますps aux -m。その質問が「grep」を実行する場合にのみ置き換えてください。ストリームから出力の最初の実際の行のみを取得する必要があり、RSS情報を含む列に到達するために空白を解析する必要がありますが、libtop.cを介して必要なものを取得するよりも簡単な場合があります。あなたがそれを必要とするものに応じて。

于 2012-08-17T07:51:45.423 に答える
0
ps aux -m

メモリの観点からプロセスを印刷します(メモリが最も高いものが一番上にあります)。このコマンドをパイプしてアクセスすると、一番上の行がフィルタリングされます。

NSPipe の開発者向けドキュメント

パイプを入れたら、あとは必要なビット (NSMutableString) を抽出するだけです。

于 2012-08-21T12:23:03.837 に答える
0

Bash は、こ​​のようなことにはかなり適しています。bash を使用すると、次のコマンドを実行できます。

ps -p `ps aux | awk '{print $4,$2}' | sort -nr | head -n 1 | awk '{print $2}'` | awk '{print $4}' | tail -n 1

(おそらく最適化される可能性がありますが、それでも機能します)

次に、次のようにします。

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"ps -p `ps aux | awk '{print $4,$2}' | sort -nr | head -n 1 | awk '{print $2}'` | awk '{print $4}' | tail -n 1"];

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

NSData *data;
data = [file readDataToEndOfFile];

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
NSLog (@"Command Returned:\n%@", string);

[string release];
[task release];

bash コマンドは機能しますが、目的の C コードはテストされていません。

于 2012-08-21T08:03:44.117 に答える