2012-08-25 4 views
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에서는 iOS가 아닌 OSX 용 앱을 제작하고 있습니다.

답변

3

"top -l 1"을 시도해 볼 수 있습니다.

"-l 1"은 1 샘플을 의미하며 비대화 형 모드에서 맨 위를 실행하고 결과를 출력하고 종료해야한다고 생각합니다.

리눅스에서 명령은 "top -n 1"입니다 ("-n 1"은 1 회만 실행한다는 의미이며, mac osx에서는 "top -l 1"과 동일해야 함).

5

top (MacOSX의 경우) 표준 출력 또는 표준 오류를 유효한 터미널에 연결하여 실행해야합니다. 터미널을 사용하지 않고 호출하면 (또는 $TERM 환경 변수가 유효한 터미널 이름 (예 : "vt100")으로 설정 됨) 오류 메시지가 표시됩니다. 터미널을 열지 못함 : 알 수 없음.

터미널을 필요로하는 대화 형 프로그램이므로 실제로는 top을 사용하면 안됩니다. ps을 사용해야합니다.

+0

ps는 필요한 정보 (실행중인 스레드 및 프로세스의 총 수)를 제공하지 않습니다. 내 유일한 옵션입니다. 어떻게하면 표준 출력을 유효한 터미널에 연결할 수 있습니까? – fdh

0

특정 정보 나 모든 세부 정보를 원하면 "/ proc"파일 시스템을 사용해야합니다.

현재 실행중인 프로세스가 들어있는/proc의 모든 파일을 읽고 (예 : 어떤 프로세스에서 어떤 파일을 열 었는지, 또는 수신 대기중인 프로세스와 같은) 많은 정보를 얻을 수 있습니다 .

'top'명령은 터미널을 열고 사용자 입력을 기다립니다. 자동화 된 스크립트에서이 스크립트를 사용할 수 없습니다.

관련 문제