diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index f605c97..dcab436 100644 *** a/src/bin/psql/common.c --- b/src/bin/psql/common.c *************** NoticeProcessor(void *arg, const char *m *** 188,194 **** /* * Code to support query cancellation * ! * Before we start a query, we enable the SIGINT signal catcher to send a * cancel request to the backend. Note that sending the cancel directly from * the signal handler is safe because PQcancel() is written to make it * so. We use write() to report to stderr because it's better to use simple --- 188,194 ---- /* * Code to support query cancellation * ! * Before we start a query, we enable SIGINT and SIGCHLD signals to send a * cancel request to the backend. Note that sending the cancel directly from * the signal handler is safe because PQcancel() is written to make it * so. We use write() to report to stderr because it's better to use simple *************** NoticeProcessor(void *arg, const char *m *** 208,213 **** --- 208,218 ---- * catcher to longjmp through sigint_interrupt_jmp. We assume readline and * fgets are coded to handle possible interruption. (XXX currently this does * not work on win32, so control-C is less useful there) + * + * SIGCHLD is also caught and handled the same to deal with cases where a user's + * PAGER or other child process exits. Otherwise, we would just keep sending + * data to a dead/zombied process. This won't typically matter except when + * FETCH_COUNT is used. */ volatile bool sigint_interrupt_enabled = false; *************** void *** 259,264 **** --- 264,272 ---- setup_cancel_handler(void) { pqsignal(SIGINT, handle_sigint); + + /* Also send SIGCHLD signals, to catch cases where the user exits PAGER */ + pqsignal(SIGCHLD, handle_sigint); } #else /* WIN32 */