2012-08-25 178 views
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");这是导致错误。

有没有人有我做错什么的想法?注意我在Mountain Lion OS X上为OSX构建一个不是iOS的应用程序。

回答

3

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

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

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

5

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

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

+0

ps不提供我需要的信息 - 正在运行的线程和进程的总数。顶部是我唯一的选择。我如何将标准输出连接到有效的终端? – fdh

0

如果你想要具体的信息或所有的细节,你应该使用“/ proc”文件系统。你可以使用readdir()和fopen()包含当前正在运行的进程的/ proc中的所有文件,并获取大量信息,例如某些进程打开了哪些文件,或者进程正在侦听哪些端口。

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