#include #include #include #include #include #define P 16 #define T 7 static void * thread(void *arg) { assert(write(1, "", 1) == 1); pause(); return arg; } static int process(void) { int i; int fds[2]; pthread_t t; struct timespec ts = { .tv_nsec = 10000000 }; (void) close(0); (void) close(1); assert(pipe(fds) == 0 && fds[0] == 0 && fds[1] == 1); for (i = 0; i < T; ++i) assert(pthread_create(&t, NULL, thread, NULL) == 0); for (i = 0; i < T; ++i) assert(read(0, fds, 1) == 1); (void) nanosleep(&ts, 0); return 0; } int main(void) { int i, s; pid_t p; for (i = 0; i < P; ++i) { assert((p = fork()) >= 0); if (p == 0) return process(); assert(waitpid(p, &s, 0) == p && WIFEXITED(s)); if (WEXITSTATUS(s)) return WEXITSTATUS(s); } return 0; }