diff --git a/cbits/runProcess.c b/cbits/runProcess.c
--- a/cbits/runProcess.c
+++ b/cbits/runProcess.c
@@ -22,16 +22,6 @@
    UNIX versions
    ------------------------------------------------------------------------- */
 
-static void
-disableItimers()
-{
-#if !defined(USE_TIMER_CREATE)
-    // we only need to do this if we're using itimers, because
-    // timer_create timers are not carried across a fork().
-    stopTimer();
-#endif
-}
-
 static long max_fd = 0;
 
 // Rts internal API, not exposed in a public header file:
@@ -52,6 +42,7 @@
     int r;
     struct sigaction dfl;
 
+    // Ordering matters here, see below [Note #431].
     if (fdStdIn == -1) {
         r = pipe(fdStdInput);
         if (r == -1) { 
@@ -82,10 +73,17 @@
     // the signal had been raised.
     blockUserSignals();
 
+    // See #4074.  Sometimes fork() gets interrupted by the timer
+    // signal and keeps restarting indefinitely.
+    stopTimer();
+
     switch(pid = fork())
     {
     case -1:
         unblockUserSignals();
+#if __GLASGOW_HASKELL__ > 612
+        startTimer();
+#endif
         if (fdStdIn == -1) {
             close(fdStdInput[0]);
             close(fdStdInput[1]);
@@ -105,7 +103,6 @@
         // WARNING!  we are now in the child of vfork(), so any memory
         // we modify below will also be seen in the parent process.
 
-        disableItimers();
         unblockUserSignals();
 
 	if (workingDirectory) {
@@ -118,6 +115,12 @@
 	    }
 	}
 	
+        // [Note #431]: Ordering matters here.  If any of the FDs
+        // 0,1,2 were initially closed, then our pipes may have used
+        // these FDs.  So when we dup2 the pipe FDs down to 0,1,2, we
+        // must do it in that order, otherwise we could overwrite an
+        // FD that we need later.
+
         if (fdStdIn == -1) {
             if (fdStdInput[0] != STDIN_FILENO) {
                 dup2 (fdStdInput[0], STDIN_FILENO);
@@ -206,6 +209,7 @@
 	break;
     }
     unblockUserSignals();
+    startTimer();
     
     return pid;
 }
diff --git a/process.cabal b/process.cabal
--- a/process.cabal
+++ b/process.cabal
@@ -1,5 +1,5 @@
 name:         process
-version:      1.0.1.2
+version:      1.0.1.3
 license:      BSD3
 license-file: LICENSE
 maintainer:   libraries@haskell.org
@@ -54,7 +54,7 @@
   }
 
   build-depends: directory >= 1.0 && < 1.1,
-                 filepath  >= 1.1 && < 1.2
+                 filepath  >= 1.1 && < 1.3
 
   extensions: CPP
 }
