2012-08-25 61 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'命令打開一個終端並等待用戶輸入。您將無法在自動化腳本中使用它