diff --git a/mongoose.c b/mongoose.c
index 20ffb1091d02d7e13e77ac3adb778e4a1feca00f..5699e555983e63ba045cc68c0ac53d9db486d9b4 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -316,9 +316,8 @@ void *mg_start_thread(void *(*f)(void *), void *p) {
 #ifdef _WIN32
   return (void *) _beginthread((void (__cdecl *)(void *)) f, 0, p);
 #else
-  pthread_t thread_id;
+  pthread_t thread_id = (pthread_t) 0;
   pthread_attr_t attr;
-  int result;
 
   (void) pthread_attr_init(&attr);
   (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
@@ -328,7 +327,7 @@ void *mg_start_thread(void *(*f)(void *), void *p) {
   (void) pthread_attr_setstacksize(&attr, USE_STACK_SIZE);
 #endif
 
-  result = pthread_create(&thread_id, &attr, f, p);
+  pthread_create(&thread_id, &attr, f, p);
   pthread_attr_destroy(&attr);
 
   return (void *) thread_id;
@@ -785,7 +784,13 @@ static void open_cgi_endpoint(struct connection *conn, const char *prog) {
     p = (char *) prog;
   }
 
-  mg_socketpair(fds);
+  // Try to create socketpair in a loop until success. mg_socketpair()
+  // can be interrupted by a signal and fail.
+  // TODO(lsm): use sigaction to restart interrupted syscall
+  do {
+    mg_socketpair(fds);
+  } while (fds[0] < 0);
+
   if (start_process(conn->server->config_options[CGI_INTERPRETER],
                     prog, blk.buf, blk.vars, dir, fds[1]) > 0) {
     conn->endpoint_type = EP_CGI;
@@ -3310,6 +3315,10 @@ struct mg_server *mg_create_server(void *server_data) {
 #ifdef _WIN32
   WSADATA data;
   WSAStartup(MAKEWORD(2, 2), &data);
+#else
+  // Ignore SIGPIPE signal, so if browser cancels the request, it
+  // won't kill the whole process.
+  signal(SIGPIPE, SIG_IGN);
 #endif
 
   LINKED_LIST_INIT(&server->active_connections);