我正在编写一个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);发布于 2009-09-27 22:38:44
令人费解的答案
在POSIX环境中,启动子进程,然后使用带有WNOWAIT选项的waitid()告诉您某个子进程已经退出。该选项使孩子处于可等待状态-也就是说,您可以使用另一个等待家庭呼叫来获取所需的信息。然后,您可以使用非POSIX wait4()系统调用来获取刚刚退出的子进程的使用信息,并处理您需要执行的记帐工作。请注意,您可能会在waitid()和wait4()调用之间发现一个不同的进程已经终止;您需要使用一个循环以及适当的标志和测试来收集所有可用的身体(死子进程),然后再返回到waitid()调用来查找其他以前未完成的子进程。您还必须担心等待系列函数中的任何函数返回以前在后台启动且现在已完成的进程的信息。
wait4(2)的Linux手册页建议WNOWAIT可以直接与wait4(2)一起工作,因此您可以更干净地完成所有工作-如果您确实需要该选项的话。
考虑是否可以使用进程组将子进程分组在一起,以便更容易地等待进程组的成员。
https://stackoverflow.com/questions/1484518
复制相似问题