【问题标题】:What is causing this command line error?是什么导致此命令行错误?
【发布时间】:2012-08-25 21:08:16
【问题描述】:

我正在尝试以编程方式调用“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 构建应用程序。

【问题讨论】:

    标签: objective-c c macos cocoa unix


    【解决方案1】:

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

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

    【讨论】:

    • ps 没有提供我需要的信息 - 正在运行的线程和进程的总数。顶部是我唯一的选择。如何将标准输出连接到有效终端?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 2020-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        相关资源
        最近更新 更多