Hello all,

when pg_ctl start is used to run PostgreSQL in a console window on Windows, it runs in the background (it is terminated by closing the window, but that is probably inevitable). There is one problem, however: The first Ctrl-C in that window, no matter in which situation, will cause the background postmaster to exit. If you, say, ping something, and press Ctrl-C to stop ping, you probably don't want the database to go away, too.

The reason is that Windows delivers the Ctrl-C event to all processes using that console, not just to the foreground one.

Here's a patch to fix that. "pg_ctl stop" still works, and it has no effect when running as a service, so it should be safe. It starts the postmaster in a new process group (similar to calling setpgrp() after fork()) that does not receive Ctrl-C events from the console window.

--
Christian
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
new file mode 100644
index 50d4586..89a9544
*** a/src/bin/pg_ctl/pg_ctl.c
--- b/src/bin/pg_ctl/pg_ctl.c
*************** CreateRestrictedProcess(char *cmd, PROCE
*** 1561,1566 ****
--- 1561,1567 ----
        HANDLE          restrictedToken;
        SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
        SID_AND_ATTRIBUTES dropSids[2];
+       DWORD           flags;
  
        /* Functions loaded dynamically */
        __CreateRestrictedToken _CreateRestrictedToken = NULL;
*************** CreateRestrictedProcess(char *cmd, PROCE
*** 1636,1642 ****
        AddUserToTokenDacl(restrictedToken);
  #endif
  
!       r = CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, 
CREATE_SUSPENDED, NULL, NULL, &si, processInfo);
  
        Kernel32Handle = LoadLibrary("KERNEL32.DLL");
        if (Kernel32Handle != NULL)
--- 1637,1650 ----
        AddUserToTokenDacl(restrictedToken);
  #endif
  
!       flags = CREATE_SUSPENDED;
! 
!       /* Protect console process from Ctrl-C */
!       if (!as_service) {
!               flags |= CREATE_NEW_PROCESS_GROUP;
!       }
! 
!       r = CreateProcessAsUser(restrictedToken, NULL, cmd, NULL, NULL, TRUE, 
flags, NULL, NULL, &si, processInfo);
  
        Kernel32Handle = LoadLibrary("KERNEL32.DLL");
        if (Kernel32Handle != NULL)
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to