#include #include #include #include #include #include "test_helpers.h" static void wait_until_child_exits(pid_t pid) { siginfo_t info; for (int i = 0; i < 50; ++i) { info.si_pid = 0; int ret = waitid(P_PID, pid, &info, WEXITED | WNOHANG | WNOWAIT); ERROR_IF(waitid, ret, == -1); if (info.si_pid == pid) { assert(info.si_code == CLD_EXITED); assert(info.si_status == 42); return; } usleep(10000); } assert(!"waitid never observed child exit"); } int main(void) { pid_t pid = fork(); ERROR_IF(fork, pid, == -1); if (pid == 0) { usleep(50000); _Exit(42); } siginfo_t info; info.si_pid = 0; int ret = waitid(P_PID, pid, &info, WEXITED | WNOHANG | WNOWAIT); ERROR_IF(waitid, ret, == -1); assert(info.si_pid == 0); wait_until_child_exits(pid); int status = 0; pid_t waited = waitpid(pid, &status, 0); ERROR_IF(waitpid, waited, == -1); assert(waited == pid); assert(WIFEXITED(status)); assert(WEXITSTATUS(status) == 42); return EXIT_SUCCESS; }