#include <sys/select.h>
#include <sys/epoll.h>
#include <stdio.h>
+#include <sys/wait.h>
+#include <sys/resource.h>
#include "process.h"
#include "debug.h"
int harvest_zombies(int pid)
{
int status;
+ struct rusage rusage;
+ char *status_str = NULL;
+ int code = 0;
if (child_count == 0)
return 0;
pr_info("Waiting on pid %d, children left: %d\n", pid,
child_count);
- pid = waitpid(pid, &status, 0);
- if (pid < 0) {
- pr_err("Error on wait(): %m\n");
- child_count--; /* Decrement child count anyway */
- }
- else {
- child_count--;
- pr_info("pid %d: exit code %d. Children left: %d\n", pid,
- status, child_count);
+ do {
+ pid = wait4(pid, &status, 0, &rusage);
+ if (pid < 0) {
+ pr_err("Error on waitid(): %m\n");
+ return 0;
+ }
+ /* Wait until the child has become a zombie */
+ } while (!WIFEXITED(status) && !WIFSIGNALED(status));
+
+ child_count--;
+ if (WIFEXITED(status)) {
+ status_str = "exited with status";
+ code = WEXITSTATUS(status);
+ } else if (WIFSIGNALED(status)) {
+ status_str = "killed by signal";
+ code = WTERMSIG(status);
}
+ pr_info("pid %d: %s %d. Children left: %d\n", pid,
+ status_str, code, child_count);
+ pr_info("pid %d: User time: %ld.%03lds, System %ld.%03lds\n", pid,
+ (long)rusage.ru_utime.tv_sec, rusage.ru_utime.tv_usec / 1000,
+ (long)rusage.ru_stime.tv_sec, rusage.ru_stime.tv_usec / 1000);
return 1;
}