I am writing a shell where I need to launch several child processes at once and record the system time and user time.
So far I am able to do it. The only problem is that I am using wait4 to grab the system resources used by the child program and put it in my rusage structure called usage.
How can I launch all the processes at the same time and keep track of the user and system times? I can remove the wait4() system call and use it outside to loop so I can make the parent wait, but if I do that then I can only record the times for the last process and not all of them.
Do you have any idea how I can fix this?
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);
A convoluted answer.
In a POSIX environment, launch the children, then use
waitid()
with theWNOWAIT
option to tell you that some child has exited. The option leaves the child in a waitable state - that is, you can use another wait-family call to garner the information you need. You can then use the non-POSIXwait4()
system call to garner the usage information for the just exited child, and deal with the accounting you need to do. Note that you might find a different process has terminated between thewaitid()
andwait4()
calls; you need to use a loop and appropriate flags and tests to collect all the available corpses (dead child processes) before going back to thewaitid()
call to find out about the other previously incomplete child processes. You also have to worry about any of the wait-family of functions returning the information for a process that was previously started in the background and has now finished.The Linux man page for wait4(2) suggests that
WNOWAIT
might work directly withwait4(2)
, so you may be able to do it all more cleanly - if, indeed, you need the option at all.Consider whether you can use process groups to group the child processes together, to make waiting for the members of the process group easier.