1

「トップ」コマンドをプログラムで呼び出そうとしています。使用したコードは次のとおりです。

char buffer [128];
char* threadsPointer;
char* procPointer;
NSString* numberOfThreadsString;
NSString* numberOfProcString;
FILE* output = popen("/usr/bin/top", "r");

while (fgets(buffer, sizeof(buffer), output) != NULL)
{
    if ((procPointer = strstr(buffer, "Processes:")) != NULL)
    {
        procPointer += strlen("Proceses: ");
        strcpy(buffer, procPointer);
        numberOfProcString =  [NSString stringWithUTF8String: buffer];
    }

    if ((threadsPointer = strstr(buffer, "sleeping,")) != NULL)
    {
        threadsPointer += strlen("sleeping, ");
        strcpy(buffer, threadsPointer);
        numberOfThreadsString =  [NSString stringWithUTF8String: buffer];
    }
}

NSLog(@"Proc: %@\nThreads: %@\n\n\n", numberOfProcString, numberOfThreadsString);

有効な出力を提供する代わりに、「ターミナルを開く際のエラー: 不明」というエラーが表示され続けます。私は問題を特定するためにコード全体を賞賛し、その行FILE* output = popen ("/usr/bin/top", "r");がエラーの原因であることに気付きました。

私が間違っていることを知っている人はいますか?iOSではなくOSX用のアプリを構築しているMountain Lion OS Xに注意してください。

4

3 に答える 3

5

topMacOSX では、標準出力または標準エラーを有効な端末に接続して実行する必要があります。端末 (または「vt100」などの有効な端末名に設定された環境変数) なしで呼び出すと、次のエラー$TERMが表示されます: Error opening terminal: unknown

topこれは端末を必要とするインタラクティブなプログラムであるため、実際にこれを使用するべきではありません。を使用する必要がありますps

于 2012-08-25T21:15:43.700 に答える
3

「top -l 1」を試すことができます。

「-l 1」は 1 サンプルを意味します。非対話モードで実行し、結果を出力して終了する必要があると思います。

Linux では、コマンドは「top -n 1」です (「-n 1」は 1 回だけ実行することを意味し、Mac OSX では「top -l 1」と同等です)。

于 2012-08-25T21:52:29.020 に答える
0

特定の情報またはすべての詳細が必要な場合は、「/proc」ファイルシステムを使用する必要があります。

現在実行中のプロセスを含む/proc内のすべてのファイルをreaddir()およびfopen()して、たとえば、あるプロセスによって開かれているファイルや、プロセスがリッスンしているポートなど、多くの情報を取得できます。

'top'コマンドは端末を開き、ユーザー入力を待ちます。自動化されたスクリプトでは使用できなくなります

于 2012-08-26T00:14:48.600 に答える