2012-09-05 3 views
6

OSX Mountain Lion에 있으며 PID를 사용하여 프로세스 이름을 검색하려고합니다. 그러나 그것은 단지 처음 15 개 문자를 검색하고PID에서 이름을 가져 옵니까?

pid_t pid = 10687; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE] = ""; 
char nameBuffer [256] = ""; 

int sizeOfVal = sizeof(nameBuffer); 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 
proc_name(pid, nameBuffer, sizeof(nameBuffer)); 

NSLog(@"Path: %s\n Name: %s\n", pathBuffer, nameBuffer); 

위의 코드를 제대로 이름을 검색 할 수 있습니다, 나머지는 "무시"

다음

내가 사용하고있는 코드입니다. 이름을 표시하는 데는 문제가 없지만 입니다. 독립형 응용 프로그램에서 위의 코드를 테스트 할 때 문제는 나머지 응용 프로그램과 관련이 없습니다. 또한 PID를 변경하려고 시도했지만 PID에 관계없이 코드에서 이름의 처음 15 자만 검색합니다. 경로 검색은 완벽하게 작동합니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가있는 사람이 있습니까?

+0

을, I 더 이상한 것을 발견했다. 지정된 버퍼 길이가 32 바이트보다 작은 경우, 이름이 짧고 (31 바이트 버퍼에 맞을지라도) 문자열에 아무 것도 배치되지 않습니다. – charliehorse55

답변

8

이 함수는 값이 구조체 proc_bsdshortinfo임을 확인합니다. 널 (NULL) 종결자를 포함 할 때 16 바이트 문자열 또는 15 개의 읽기 가능한 문자를 리턴하는 것으로 제한됩니다. sys/param.h에서

:

#define MAXCOMLEN 16  /* max command name remembered */ 

sys/proc_info.h에서 :

struct proc_bsdshortinfo { 
     uint32_t    pbsi_pid;  /* process id */ 
     uint32_t    pbsi_ppid;  /* process parent id */ 
     uint32_t    pbsi_pgid;  /* process perp id */ 
    uint32_t    pbsi_status;  /* p_stat value, SZOMB, SRUN, etc */ 
    char     pbsi_comm[MAXCOMLEN]; /* upto 16 characters of process name */ 
    uint32_t    pbsi_flags;    /* 64bit; emulated etc */ 
     uid_t     pbsi_uid;  /* current uid on process */ 
     gid_t     pbsi_gid;  /* current gid on process */ 
     uid_t     pbsi_ruid;  /* current ruid on process */ 
     gid_t     pbsi_rgid;  /* current tgid on process */ 
     uid_t     pbsi_svuid;  /* current svuid on process */ 
     gid_t     pbsi_svgid;  /* current svgid on process */ 
     uint32_t    pbsi_rfu;  /* reserved for future use*/ 
}; 

편집 :이 극복하려면, 마지막 경로 구성 요소 얻을 : 나는이 문제를 조사로서

pid_t pid = 3051; 
char pathBuffer [PROC_PIDPATHINFO_MAXSIZE]; 
proc_pidpath(pid, pathBuffer, sizeof(pathBuffer)); 

char nameBuffer[256]; 

int position = strlen(pathBuffer); 
while(position >= 0 && pathBuffer[position] != '/') 
{ 
    position--; 
} 

strcpy(nameBuffer, pathBuffer + position + 1); 

printf("path: %s\n\nname:%s\n\n", pathBuffer, nameBuffer); 
+0

감사합니다. 혹시이 문제를 알고 계신가요? – fdh

+0

전체 경로를 가져온 다음 문자열을 마지막 경로 구성 요소로 트리밍합니다. – charliehorse55

+0

더 우아한 해결책이 없습니까? 프로세스 정보 검색은 많은 프로그램에서 핵심적인 부분이므로 이러한 정보를 검색하기위한보다 효율적인 인터페이스가 있어야합니다. – fdh

관련 문제