fdh*_*fdh 6 c unix macos process objective-c
我在OSX Mountain Lion上,并尝试使用其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);
Run Code Online (Sandbox Code Playgroud)
上面的代码能够正确检索名称,但它只检索前15个字符并"忽略"其余字符.请注意,这不是显示名称的问题,而是检索它.问题不在我的应用程序的其余部分,因为我在独立应用程序中测试上面的代码.另请注意,我尝试更改PID,但无论我尝试什么PID,代码只检索名称的前15个字符.路径检索工作完美.
有没有人对我做错了什么有任何想法?
该函数查看的值是struct proc_bsdshortinfo.它包含返回16字节字符串,或包含空终止符时的15个可读字符.
来自sys/param.h:
#define MAXCOMLEN 16 /* max command name remembered */
Run Code Online (Sandbox Code Playgroud)
来自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*/
};
Run Code Online (Sandbox Code Playgroud)
编辑:要解决这个问题,请获取最后一个路径组件:
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3946 次 |
| 最近记录: |