【问题标题】:getrusage() get system time, user time. Unix programming helpgetrusage() 获取系统时间、用户时间。 Unix 编程帮助
【发布时间】:2009-09-27 21:26:42
【问题描述】:

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

到目前为止,我能够做到。唯一的问题是我正在使用 wait4 来获取子程序使用的系统资源,并将其放入我的名为 usage 的 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);

【问题讨论】:

    标签: c++ timer systemtime getrusage rusage


    【解决方案1】:

    一个复杂的答案。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      相关资源
      最近更新 更多