1

我正在尝试以编程方式调用“top”命令。以下是使用的代码:

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");那是导致错误的原因。

有谁知道我做错了什么?注意我在 Mountain Lion OS X 上为 OSX 而不是 iOS 构建应用程序。

4

3 回答 3

5

top在 MacOSX 上要求其标准输出或标准错误连接到有效终端才能运行。当您在没有终端(或$TERM设置为有效终端名称的环境变量,如“vt100”)的情况下调用它时,它会给您错误:打开终端时出错:未知

你真的不应该使用top它,因为它是一个需要终端的交互式程序。你应该只是使用ps.

于 2012-08-25T21:15:43.700 回答
3

你可以试试“top -l 1”。

“-l 1”表示 1 个样本,我认为它应该在非交互模式下运行 top,打印结果并退出。

在 linux 上,命令是“top -n 1”(“-n 1”意味着只运行 1 次迭代,这应该相当于 mac osx 上的“top -l 1”)。

于 2012-08-25T21:52:29.020 回答
0

如果您想要特定信息或所有详细信息,您应该使用“/proc”文件系统。

您可以 readdir() 和 fopen() 包含当前正在运行的进程的 /proc 中的所有文件并获取大量信息,例如某些进程打开了哪些文件,或者进程正在侦听哪些端口。

'top' 命令打开一个终端并等待用户输入。您将无法在自动化脚本中使用它

于 2012-08-26T00:14:48.600 回答