我正在尝试做的简短摘要:
模拟一个shell程序,当用户在自己的进程中输入命令时执行命令,并在每个进程完成后输出所有子进程和shell在CPU上花费的总时间,以及最大内存量使用了一个过程。
创建shell并执行命令不是问题,但是当谈到跟踪流程的统计信息时,我就会陷入困境。
为了跟踪CPU时间,我打算使用时间系统调用并将用户命令通过shell传递到时间,以便进程可以完成运行,并且在执行结束时我将获得时间信息我可以。但是当谈到获得shell(当前程序)花在CPU上的时间时,我并不完全确定要做什么,因为我见过或遇到的每个时间实现都使用上面传递方法命令和参数到时间,我不能用shell做到这一点。我现在唯一的想法就是让shell成为子进程,随着时间的推移运行,当shell完成运行子进程时,重新启动shell,从时间中提取信息,然后重新启动shell。这似乎非常圆,但我找不到任何系统调用来做我想做的事。
至于内存使用情况,我正在考虑使用top然后将信息拉出来,但iirc top只监控当前的内存使用情况,而不是总数。我能想到的唯一另一件事就是进入/ proc //并尝试从那里的某个地方提取信息。再次,似乎非常迂回。
任何朝着正确方向的推动都会很棒。所有这些都是在C中完成的,如果这有所不同的话。
答案 0 :(得分:0)
一种可能的方法是将每个用户命令作为单独的进程运行,并在进程完成时获取资源使用信息。好的,运行命令作为进程很容易(参见fork()和exec * family)。资源使用情况(时间,内存等)怎么样?我建议看一下getrusage()系统调用。
男人说:getrusage()函数应该 提供所用资源的衡量标准 通过 当前流程或其终止和等待的孩子 流程。如果值 who参数是RUSAGE_SELF,信息应该是 回来了 当前流程使用的资源。如果是的价值 参数是谁 RUSAGE_CHILDREN,应返回有关所用资源的信息 通过 终止和等待当前进程的孩子。
让我们看看这个系统调用提供了哪些信息:
struct rusage {
struct timeval ru_utime; /* user time used */
struct timeval ru_stime; /* system time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims */
long ru_majflt; /* page faults */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* messages sent */
long ru_msgrcv; /* messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
};
我认为这足以解决您的问题。