getrusage()获取系统时间,用户时间。 Unix编程帮助

时间:2009-09-27 21:26:42

标签: c++ timer systemtime getrusage rusage

我正在编写一个shell,我需要同时启动多个子进程并记录系统时间和用户时间。

到目前为止,我能够做到。唯一的问题是我使用wait4来获取子程序使用的系统资源,并把它放在我称之为用法的rusage结构中。

如何同时启动所有流程并跟踪用户和系统时间?我可以删除wait4()系统调用并在外面使用它来循环,这样我可以让父等待,但如果我这样做,那么我只能记录最后一个进程的时间而不是所有进程。

你知道如何解决这个问题吗?

execute(commandPipev,"STANDARD",0);
wait4(pid,&status,0,&usage);
printf("Child process: %s\t PID:%d\n", commandPipev[0], pid);
printf("System time: %ld.%06ld sec\n",usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
printf("User time:   %ld.%06ld sec\n\n",usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);

1 个答案:

答案 0 :(得分:2)

一个错综复杂的答案。

在POSIX环境中,启动子项,然后使用带有waitid()选项的WNOWAIT告诉您某个孩子已退出。该选项使孩子处于等待状态 - 也就是说,您可以使用另一个等待家人呼叫来获取您需要的信息。然后,您可以使用非POSIX wait4()系统调用来获取刚刚退出的子项的使用信息,并处理您需要执行的会计。请注意,您可能会发现在waitid()wait4()来电之间已终止其他流程;你需要使用循环和适当的标志和测试来收集所有可用的尸体(死子进程),然后再回到waitid()调用以找出其他先前不完整的子进程。您还必须担心任何wait-family函数返回先前在后台启动并且现在已完成的进程的信息。

wait4(2)的Linux手册页建议WNOWAIT可能直接与wait4(2)一起使用,因此您可以更干净地完成这项工作 - 如果您确实需要该选项一点都不。

考虑是否可以使用进程组将子进程分组在一起,以便更轻松地等待进程组的成员。