diff --git a/doc/src/sgml/ref/postgres-ref.sgml b/doc/src/sgml/ref/postgres-ref.sgml new file mode 100644 index 8e225e4..731682c *** a/doc/src/sgml/ref/postgres-ref.sgml --- b/doc/src/sgml/ref/postgres-ref.sgml *************** PostgreSQL documentation *** 590,595 **** --- 590,620 ---- + + + Platform-specific Options + + + + + background execution + Windows + + + + This option is effective on Windows only and ignored on all other platforms. + + + It instructs the server to ignore the signals caused by pressing + CtrlC or + CtrlBreak + in a console window. It is used automatically by + pg_ctl when called with the + subcommand. + + + + diff --git a/src/backend/port/win32/signal.c b/src/backend/port/win32/signal.c new file mode 100644 index 322b857..91f8243 *** a/src/backend/port/win32/signal.c --- b/src/backend/port/win32/signal.c *************** static pqsigfunc pg_signal_defaults[PG_S *** 41,46 **** --- 41,48 ---- static DWORD WINAPI pg_signal_thread(LPVOID param); static BOOL WINAPI pg_console_handler(DWORD dwCtrlType); + extern bool IsBackgroundPostmaster; + extern bool IsUnderPostmaster; /* * pg_usleep --- delay the specified number of microseconds, but *************** pg_signal_thread(LPVOID param) *** 346,358 **** static BOOL WINAPI pg_console_handler(DWORD dwCtrlType) { ! if (dwCtrlType == CTRL_C_EVENT || ! dwCtrlType == CTRL_BREAK_EVENT || ! dwCtrlType == CTRL_CLOSE_EVENT || ! dwCtrlType == CTRL_SHUTDOWN_EVENT) { pg_queue_signal(SIGINT); ! return TRUE; } ! return FALSE; } --- 348,369 ---- static BOOL WINAPI pg_console_handler(DWORD dwCtrlType) { ! switch (dwCtrlType) { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + /* Ignore if started with "pg_ctl start". */ + if (IsUnderPostmaster || IsBackgroundPostmaster) + break; + /* fall through */ + case CTRL_CLOSE_EVENT: + case CTRL_SHUTDOWN_EVENT: pg_queue_signal(SIGINT); ! break; ! default: ! return FALSE; } ! ! return TRUE; } + diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c new file mode 100644 index b573fd8..d1ce978 *** a/src/backend/postmaster/postmaster.c --- b/src/backend/postmaster/postmaster.c *************** PostmasterMain(int argc, char *argv[]) *** 751,771 **** *value; ParseLongOption(optarg, &name, &value); ! if (!value) { ! if (opt == '-') ! ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("--%s requires a value", ! optarg))); ! else ! ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("-c %s requires a value", ! optarg))); } - SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV); free(name); if (value) free(value); --- 751,780 ---- *value; ParseLongOption(optarg, &name, &value); ! ! #ifdef WIN32 ! if (strcmp(name, "background") == 0) ! IsBackgroundPostmaster = true; ! else ! #endif { ! if (!value) ! { ! if (opt == '-') ! ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("--%s requires a value", ! optarg))); ! else ! ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("-c %s requires a value", ! optarg))); ! } ! ! SetConfigOption(name, value, PGC_POSTMASTER, PGC_S_ARGV); } free(name); if (value) free(value); diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c new file mode 100644 index be74835..051b33d *** a/src/backend/utils/init/globals.c --- b/src/backend/utils/init/globals.c *************** bool IsUnderPostmaster = false; *** 89,94 **** --- 89,107 ---- bool IsBinaryUpgrade = false; bool IsBackgroundWorker = false; + #ifdef WIN32 + /* + * This controls whether the postmaster process will respond to incoming + * console events (Ctrl-C, Ctrl-Break). If the database was started using + * "pg_ctl start", it is running in the background, but will still + * receive the signals generated by these key combinations. + * + * The reaction of the other server processes is controlled by + * IsUnderPostmaster instead. + */ + bool IsBackgroundPostmaster = false; + #endif + bool ExitOnAnyError = false; int DateStyle = USE_ISO_DATES; diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c new file mode 100644 index fc87e7d..e0d676e *** a/src/bin/pg_ctl/pg_ctl.c --- b/src/bin/pg_ctl/pg_ctl.c *************** start_postmaster(void) *** 453,462 **** PROCESS_INFORMATION pi; if (log_file != NULL) ! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" >> \"%s\" 2>&1" SYSTEMQUOTE, exec_path, pgdata_opt, post_opts, DEVNULL, log_file); else ! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s < \"%s\" 2>&1" SYSTEMQUOTE, exec_path, pgdata_opt, post_opts, DEVNULL); if (!CreateRestrictedProcess(cmd, &pi, false)) --- 453,462 ---- PROCESS_INFORMATION pi; if (log_file != NULL) ! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s --background < \"%s\" >> \"%s\" 2>&1" SYSTEMQUOTE, exec_path, pgdata_opt, post_opts, DEVNULL, log_file); else ! snprintf(cmd, MAXPGPATH, "CMD /C " SYSTEMQUOTE "\"%s\" %s%s --background < \"%s\" 2>&1" SYSTEMQUOTE, exec_path, pgdata_opt, post_opts, DEVNULL); if (!CreateRestrictedProcess(cmd, &pi, false)) diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h new file mode 100644 index 0d61b82..3a527e9 *** a/src/include/miscadmin.h --- b/src/include/miscadmin.h *************** extern PGDLLIMPORT bool IsUnderPostmaste *** 136,141 **** --- 136,145 ---- extern bool IsBackgroundWorker; extern bool IsBinaryUpgrade; + #ifdef WIN32 + extern bool IsBackgroundPostmaster; + #endif + extern bool ExitOnAnyError; extern PGDLLIMPORT char *DataDir;