获取外部进程的 cpu 时间,它在 OS X 上仍然 运行 时成为子进程
get cpu time of an external process and it children while it still running on OS X
在 linux 上,我可以使用 How to calculate the CPU usage of a process by PID in Linux from C? 中所述的 /proc
来获取进程及其子进程的 cpu 时间。
我如何在 OS X 上执行此操作?
您可以使用sysctl获取进程信息。因此,让我们假设您有一个进程的 pid:-
#include <sys/sysctl.h>
struct kinfo_proc *getProcessInfo(pid_t pid)
{
struct kinfo_proc* list = NULL;
int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
size_t size = 0;
sysctl(mib, sizeof(mib) / sizeof(*mib), NULL, &size, NULL, 0);
list = (kinfo_proc*)malloc(size);
sysctl(mib, sizeof(mib) / sizeof(*mib), list, &size, NULL, 0);
return list;
}
记得检查 sysctl 返回的错误。为简洁起见,我将它们排除在外,并且不要忘记在完成后释放返回的结构。
返回的kinfo_proc结构包含一个结构extern_proc,你会看到它有如下属性: -
struct extern_proc {
union {
struct {
struct proc *__p_forw; /* Doubly-linked run/sleep queue. */
struct proc *__p_back;
} p_st1;
struct timeval __p_starttime; /* process start time */
} p_un;
....
}
__p_starttime,就是您要找的。
在 linux 上,我可以使用 How to calculate the CPU usage of a process by PID in Linux from C? 中所述的 /proc
来获取进程及其子进程的 cpu 时间。
我如何在 OS X 上执行此操作?
您可以使用sysctl获取进程信息。因此,让我们假设您有一个进程的 pid:-
#include <sys/sysctl.h>
struct kinfo_proc *getProcessInfo(pid_t pid)
{
struct kinfo_proc* list = NULL;
int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
size_t size = 0;
sysctl(mib, sizeof(mib) / sizeof(*mib), NULL, &size, NULL, 0);
list = (kinfo_proc*)malloc(size);
sysctl(mib, sizeof(mib) / sizeof(*mib), list, &size, NULL, 0);
return list;
}
记得检查 sysctl 返回的错误。为简洁起见,我将它们排除在外,并且不要忘记在完成后释放返回的结构。
返回的kinfo_proc结构包含一个结构extern_proc,你会看到它有如下属性: -
struct extern_proc {
union {
struct {
struct proc *__p_forw; /* Doubly-linked run/sleep queue. */
struct proc *__p_back;
} p_st1;
struct timeval __p_starttime; /* process start time */
} p_un;
....
}
__p_starttime,就是您要找的。