Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 进程使用的CPU时间_Objective C_Cocoa_Macos_Process - Fatal编程技术网

Objective c 进程使用的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).

我已经设法实现了上面的代码,以获得所有正在运行的进程及其ID的列表。我现在需要的是提取每个进程使用CPU的时间

我尝试引用代码中的键,但当我尝试打印“CPU时间的滴答声”时,所有进程的值都为零。另外,即使我得到了一个值,我也不确定“CPU时间的滴答声”是否正是我想要的

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()函数。请注意:

  • 您需要对Mach编程基础有一个基本的了解,才能理解这段代码,因为它使用任务端口等
  • 如果您想简单地使用libtop,您必须下载源代码并自己编译
  • 您的进程将需要特权才能访问其他进程的任务端口
  • 如果所有这些听起来相当令人畏惧,那么……有一种方法可以使用不那么深奥的API:只需生成一个顶级进程并解析其标准输出。快速浏览顶部(1)手册页,会发现以下一点:

    $ 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