是什么导致此命令行错误?

时间:2012-08-25 21:08:17

标签: objective-c c macos cocoa unix

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

3 个答案:

答案 0 :(得分:5)

MacOSX上的

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

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

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

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