Objective c 进程使用的CPU时间
我已经设法实现了上面的代码,以获得所有正在运行的进程及其ID的列表。我现在需要的是提取每个进程使用CPU的时间 我尝试引用代码中的键,但当我尝试打印“CPU时间的滴答声”时,所有进程的值都为零。另外,即使我得到了一个值,我也不确定“CPU时间的滴答声”是否正是我想要的Objective c 进程使用的CPU时间,objective-c,cocoa,macos,process,Objective C,Cocoa,Macos,Process,我已经设法实现了上面的代码,以获得所有正在运行的进程及其ID的列表。我现在需要的是提取每个进程使用CPU的时间 我尝试引用代码中的键,但当我尝试打印“CPU时间的滴答声”时,所有进程的值都为零。另外,即使我得到了一个值,我也不确定“CPU时间的滴答声”是否正是我想要的 struct vmspace *p_vmspace; /* Address space. */ struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY).
struct vmspace *p_vmspace; /* Address space. */
struct sigacts *p_sigacts; /* Signal actions, state (PROC ONLY). */
int p_flag; /* P_* flags. */
char p_stat; /* S* process status. */
pid_t p_pid; /* Process identifier. */
pid_t p_oppid; /* Save parent pid during ptrace. XXX */
int p_dupfd; /* Sideways return value from fdopen. XXX */
/* Mach related */
caddr_t user_stack; /* where user stack was allocated */
void *exit_thread; /* XXX Which thread is exiting? */
int p_debugger; /* allow to debug */
boolean_t sigwait; /* indication to suspend */
/* scheduling */
u_int p_estcpu; /* Time averaged value of p_cpticks. */
int p_cpticks; /* Ticks of cpu time. */
fixpt_t p_pctcpu; /* %cpu for this process during p_swtime */
void *p_wchan; /* Sleep address. */
char *p_wmesg; /* Reason for sleep. */
u_int p_swtime; /* Time swapped in or out. */
u_int p_slptime; /* Time since last blocked. */
struct itimerval p_realtimer; /* Alarm timer. */
struct timeval p_rtime; /* Real time. */
u_quad_t p_uticks; /* Statclock hits in user mode. */
u_quad_t p_sticks; /* Statclock hits in system mode. */
u_quad_t p_iticks; /* Statclock hits processing intr. */
int p_traceflag; /* Kernel trace points. */
struct vnode *p_tracep; /* Trace to vnode. */
int p_siglist; /* DEPRECATED */
struct vnode *p_textvp; /* Vnode of executable. */
int p_holdcnt; /* If non-zero, don't swap. */
sigset_t p_sigmask; /* DEPRECATED. */
sigset_t p_sigignore; /* Signals being ignored. */
sigset_t p_sigcatch; /* Signals being caught by user. */
u_char p_priority; /* Process priority. */
u_char p_usrpri; /* User-priority based on p_cpu and p_nice. */
char p_nice; /* Process "nice" value. */
char p_comm[MAXCOMLEN+1];
struct pgrp *p_pgrp; /* Pointer to process group. */
struct user *p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */
u_short p_xstat; /* Exit status for wait; also stop signal. */
u_short p_acflag; /* Accounting flags. */
struct rusage *p_ru; /* Exit information. XXX */
事实上,我也尝试过打印p_cpticks的时间平均值和其他一些值,但从未得到有趣的值。这是我的代码,它正在打印检索到的信息(我从cocoabuilder.com获得):
-(NSDictionary*)getProcessList{
NSMutableDictionary*ProcList=[[NSMutableDictionary alloc]init];
kinfo_proc*mylist;
大小\u t mycount=0;
mylist=(kinfo_proc*)malloc(sizeof(kinfo_proc));
GetBSDProcessList(&mylist,&mycount);
printf(“有%d个进程。\n”,(int)mycount);
NSLog(@“==”);
int k;
对于(k=0;kkp_proc.p_comm];
//[ProcList setObject:processName forKey:processName];
//[proclistsetobject:proc->kp_proc.p_pid forKey:processName];
//printf(“ID:%d-名称:%s\n”,proc->kp\u proc.p\u pid,proc->kp\u proc.p\u comm);
printf(“ID:%d-名称:%s CPU时间:%d\n”,proc->kp\U proc.p\U pid,proc->kp\U proc.p\U comm,proc->kp\U proc.p\U pid);
//右键单击p_comm并选择“跳转到定义”以查找其他值。
}
免费(mylist);
返回[ProcList autorelease];
}
谢谢
编辑:我刚刚就这个问题悬赏。我特别想要的是得到每个进程在CPU上花费的时间量
如果,除此之外,您可以给出进程正在使用的%CPU,那将是非常棒的
代码应该是最优的,因为它将每秒调用一次,并且该方法将在所有正在运行的进程上调用。最好是目标C
再次感谢
编辑2
此外,任何关于人们为什么忽视这个问题的评论都会很有帮助:)看看达尔文的源代码,特别是libtop\u pinfo\u update\u cpu\u usage()函数。请注意:
$ top -s 1 -l 3600 -stats pid,cpu,time
也就是说,每秒采样一次,持续3600秒(一小时),并以日志形式仅向标准输出pid、cpu使用率和时间的统计信息
生成和管理子top进程,然后解析其输出都是简单的Unix编程练习。您看过struct
rusage
了吗?您已将其列出并注释为“退出信息”,但我知道它包含流程实际使用的资源。看一看。我记得我使用了getrusage()
来计算当前进程的科学计算中使用的确切CPU时间量,所以您只需要知道如何为列表中的每个进程查询该结构,我想我不认为人们会忽视您的问题。只是Mac的底层操作系统编程是一个非常专业的话题。测量一个进程在CPU上花费的真实时间也是一个有争议的话题。谢谢你的反馈。有一段时间,我觉得自己迷失在了网络空间。希望我们能很快得到一些答案。这对您没有帮助,但在上面的代码中,您似乎打印了两次PID,有没有办法获得一些示例代码来了解如何实现这一点?我甚至不太清楚该通过该方法传递哪些参数:(我已经编辑了我的答案,提供了一个不太深奥的替代方法:-)有很多关于使用NSTask管理子进程的教程材料……我建议使用NSCANNER,并使用NSScanner解析top的输出。非常感谢!我们肯定离我能做到的事情越来越近了。干得好!:)嗨@EricBrotto!!您是否能够按进程查找cpu使用情况?请分享您在这项任务中的经验。getrusage()只适用于调用进程及其子进程。我知道,我在上面说过,但我相信有一种方法可以以类似的方式查询其他进程way@rano. 这似乎是可行的,我现在正在玩它。不过,一些示例代码会非常棒;)@拉诺在我看来,虽然你的建议很好,但它只涉及当前的流程。是否有必要将此应用于所有进程?@Eric Brotto,很抱歉,如前所述,getrusage()
实际上只能用于当前进程或其子进程。我可以为您提供一些我使用过的功能。我的想法是应该有类似于查询其他过程的东西,但我不知道到底是哪个。
$ top -s 1 -l 3600 -stats pid,cpu,time