2012-09-05 103 views
6

我在OSX Mountain Lion上,试图使用PID检索进程的名称。从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); 

上面的代码能够正常检索名称,但它只能检索前15个字符和“忽略”的其余部分。请注意,这不是显示名称的问题,但检索它。问题不在于我的应用程序的其他部分,因为我正在独立应用程序中测试上述代码。另外请注意,我尝试更改PID,但不管我尝试使用哪个PID,代码仅检索名称的前15个字符。路径检索完美。

有没有人有什么想法我做错了什么?

+0

当我研究这个问题,我发现一些更古怪。如果指定的缓冲区长度小于32字节,则即使名称很短(并且适合31字节缓冲区),也不会有任何内容放入该字符串中。 – charliehorse55

回答

8

函数查看的值是struct proc_bsdshortinfo。它仅限于返回一个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