- write(signal_pipe[1], &s, sizeof(int));
- //fprintf(stderr, "got sig %i, write returned %d\n", s, ret);
+ /*
+ * Signal handlers that make system calls must save a copy of errno on
+ * entry to the handler and restore it on exit, to prevent the
+ * possibility of overwriting a errno value that had previously been
+ * set in the main program.
+ */
+ int save_errno = errno;
+ ssize_t ret = write(signal_pipe[1], &s, sizeof(int));
+
+ if (ret == sizeof(int)) {
+ errno = save_errno;
+ return;
+ }
+ /*
+ * This is a fatal error which should never happen. We must not call
+ * PARA_XXX_LOG() here because this might acquire the log mutex which
+ * is already taken by the main program if the interrupt occurs while a
+ * log message is being printed. The mutex will not be released as long
+ * as this signal handler is running, so a deadlock ensues.
+ */
+ exit(EXIT_FAILURE);