11ac21102f27aee0114733566ef4abd559051c5dasewardj#include <stdlib.h>
21ac21102f27aee0114733566ef4abd559051c5dasewardj#include <stdio.h>
31ac21102f27aee0114733566ef4abd559051c5dasewardj#include <errno.h>
41ac21102f27aee0114733566ef4abd559051c5dasewardj#include <unistd.h>
51ac21102f27aee0114733566ef4abd559051c5dasewardj#include <sys/wait.h>
61ac21102f27aee0114733566ef4abd559051c5dasewardjvoid fork_chain(int level)
71ac21102f27aee0114733566ef4abd559051c5dasewardj{
81ac21102f27aee0114733566ef4abd559051c5dasewardj   int pid;
91ac21102f27aee0114733566ef4abd559051c5dasewardj
101ac21102f27aee0114733566ef4abd559051c5dasewardj   printf ("forking level %d\n", level);
111ac21102f27aee0114733566ef4abd559051c5dasewardj   fflush (stdout);
121ac21102f27aee0114733566ef4abd559051c5dasewardj   pid = fork();
131ac21102f27aee0114733566ef4abd559051c5dasewardj   if (pid == -1) {
141ac21102f27aee0114733566ef4abd559051c5dasewardj      perror("fork");
151ac21102f27aee0114733566ef4abd559051c5dasewardj      exit(1);
161ac21102f27aee0114733566ef4abd559051c5dasewardj   }
171ac21102f27aee0114733566ef4abd559051c5dasewardj
181ac21102f27aee0114733566ef4abd559051c5dasewardj   if (pid == 0) {
191ac21102f27aee0114733566ef4abd559051c5dasewardj      if (level > 0) {
201ac21102f27aee0114733566ef4abd559051c5dasewardj         fork_chain (level - 1);
211ac21102f27aee0114733566ef4abd559051c5dasewardj      }
221ac21102f27aee0114733566ef4abd559051c5dasewardj   } else {
231ac21102f27aee0114733566ef4abd559051c5dasewardj      int ret;
241ac21102f27aee0114733566ef4abd559051c5dasewardj      int status;
251ac21102f27aee0114733566ef4abd559051c5dasewardj      while((ret = waitpid(pid, &status, 0)) != pid) {
261ac21102f27aee0114733566ef4abd559051c5dasewardj         if (errno != EINTR) {
271ac21102f27aee0114733566ef4abd559051c5dasewardj            perror("waitpid");
281ac21102f27aee0114733566ef4abd559051c5dasewardj            exit(1);
291ac21102f27aee0114733566ef4abd559051c5dasewardj         }
301ac21102f27aee0114733566ef4abd559051c5dasewardj      }
311ac21102f27aee0114733566ef4abd559051c5dasewardj   }
321ac21102f27aee0114733566ef4abd559051c5dasewardj}
331ac21102f27aee0114733566ef4abd559051c5dasewardjint main()
341ac21102f27aee0114733566ef4abd559051c5dasewardj{
35f5194b352c74cba18ba0e628567fd8183f0a6048sewardj   fork_chain (15);
361ac21102f27aee0114733566ef4abd559051c5dasewardj   return 0;
371ac21102f27aee0114733566ef4abd559051c5dasewardj}
38