--- bash/jobs.c.orig Wed Jun 20 00:02:39 2007 +++ bash/jobs.c Sun Sep 16 23:29:41 2007 @@ -1611,6 +1611,7 @@ { sigset_t set, oset; pid_t pid; + unsigned int forksleep; sigemptyset (&set); sigaddset (&set, SIGCHLD); @@ -1631,9 +1632,16 @@ #endif /* BUFFERED_INPUT */ /* Create the child, handle severe errors. */ - if ((pid = fork ()) < 0) + forksleep = 1; + while ((pid = fork ()) < 0 && errno == EAGAIN && forksleep < 32) { - sys_error ("fork"); + if (sleep (forksleep)) break; /* break on signals, e.g. ^C */ + forksleep <<= 1; + } + + if (pid < 0) + { + sys_error ("fork"); /* Kill all of the processes in the current pipeline. */ terminate_current_pipeline ();