patch 8.0.0045
Problem:    Calling job_stop() right after job_start() does not work.
Solution:   Block signals while fork is still busy. (Ozaki Kiichi, closes
            #1155)
diff --git a/src/os_unix.c b/src/os_unix.c
index bc9acd4..0569184 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -211,6 +211,15 @@
 static void catch_int_signal(void);
 static void set_signals(void);
 static void catch_signals(RETSIGTYPE (*func_deadly)(), RETSIGTYPE (*func_other)());
+#ifdef HAVE_SIGPROCMASK
+# define SIGSET_DECL(set)	sigset_t set;
+# define BLOCK_SIGNALS(set)	block_signals(set)
+# define UNBLOCK_SIGNALS(set)	unblock_signals(set)
+#else
+# define SIGSET_DECL(set)
+# define BLOCK_SIGNALS(set)	do { /**/ } while (0)
+# define UNBLOCK_SIGNALS(set)	do { /**/ } while (0)
+#endif
 static int  have_wildcard(int, char_u **);
 static int  have_dollars(int, char_u **);
 
@@ -1468,6 +1477,33 @@
 	    signal(signal_info[i].sig, func_other);
 }
 
+#ifdef HAVE_SIGPROCMASK
+    static void
+block_signals(sigset_t *set)
+{
+    sigset_t	newset;
+    int		i;
+
+    sigemptyset(&newset);
+
+    for (i = 0; signal_info[i].sig != -1; i++)
+	sigaddset(&newset, signal_info[i].sig);
+
+# if defined(_REENTRANT) && defined(SIGCONT)
+    /* SIGCONT isn't in the list, because its default action is ignore */
+    sigaddset(&newset, SIGCONT);
+# endif
+
+    sigprocmask(SIG_BLOCK, &newset, set);
+}
+
+    static void
+unblock_signals(sigset_t *set)
+{
+    sigprocmask(SIG_SETMASK, set, NULL);
+}
+#endif
+
 /*
  * Handling of SIGHUP, SIGQUIT and SIGTERM:
  * "when" == a signal:       when busy, postpone and return FALSE, otherwise
@@ -4283,12 +4319,18 @@
 
     if (!pipe_error)			/* pty or pipe opened or not used */
     {
+	SIGSET_DECL(curset)
+
 # ifdef __BEOS__
 	beos_cleanup_read_thread();
 # endif
 
-	if ((pid = fork()) == -1)	/* maybe we should use vfork() */
+	BLOCK_SIGNALS(&curset);
+	pid = fork();	/* maybe we should use vfork() */
+	if (pid == -1)
 	{
+	    UNBLOCK_SIGNALS(&curset);
+
 	    MSG_PUTS(_("\nCannot fork\n"));
 	    if ((options & (SHELL_READ|SHELL_WRITE))
 # ifdef FEAT_GUI
@@ -4315,6 +4357,7 @@
 	else if (pid == 0)	/* child */
 	{
 	    reset_signals();		/* handle signals normally */
+	    UNBLOCK_SIGNALS(&curset);
 
 	    if (!show_shell_mess || (options & SHELL_EXPAND))
 	    {
@@ -4458,6 +4501,7 @@
 	     */
 	    catch_signals(SIG_IGN, SIG_ERR);
 	    catch_int_signal();
+	    UNBLOCK_SIGNALS(&curset);
 
 	    /*
 	     * For the GUI we redirect stdin, stdout and stderr to our window.
@@ -5069,6 +5113,7 @@
     int		use_file_for_out = options->jo_io[PART_OUT] == JIO_FILE;
     int		use_file_for_err = options->jo_io[PART_ERR] == JIO_FILE;
     int		use_out_for_err = options->jo_io[PART_ERR] == JIO_OUT;
+    SIGSET_DECL(curset)
 
     if (use_out_for_err && use_null_for_out)
 	use_null_for_err = TRUE;
@@ -5140,13 +5185,14 @@
 	    goto failed;
     }
 
+    BLOCK_SIGNALS(&curset);
     pid = fork();	/* maybe we should use vfork() */
-    if (pid  == -1)
+    if (pid == -1)
     {
 	/* failed to fork */
+	UNBLOCK_SIGNALS(&curset);
 	goto failed;
     }
-
     if (pid == 0)
     {
 	int	null_fd = -1;
@@ -5154,6 +5200,7 @@
 
 	/* child */
 	reset_signals();		/* handle signals normally */
+	UNBLOCK_SIGNALS(&curset);
 
 # ifdef HAVE_SETSID
 	/* Create our own process group, so that the child and all its
@@ -5234,6 +5281,8 @@
     }
 
     /* parent */
+    UNBLOCK_SIGNALS(&curset);
+
     job->jv_pid = pid;
     job->jv_status = JOB_STARTED;
     job->jv_channel = channel;  /* ch_refcount was set above */
@@ -5357,7 +5406,6 @@
 	}
     }
     return NULL;
-
 }
 
     int