github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/runtime/testdata/testwinlibsignal/main.c (about)

     1  #include <windows.h>
     2  #include <stdio.h>
     3  
     4  HANDLE waitForCtrlBreakEvent;
     5  
     6  BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
     7  {
     8      switch (fdwCtrlType)
     9      {
    10      case CTRL_BREAK_EVENT:
    11          SetEvent(waitForCtrlBreakEvent);
    12          return TRUE;
    13      default:
    14          return FALSE;
    15      }
    16  }
    17  
    18  int main(void)
    19  {
    20      waitForCtrlBreakEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    21      if (!waitForCtrlBreakEvent) {
    22          fprintf(stderr, "ERROR: Could not create event");
    23          return 1;
    24      }
    25  
    26      if (!SetConsoleCtrlHandler(CtrlHandler, TRUE))
    27      {
    28          fprintf(stderr, "ERROR: Could not set control handler");
    29          return 1;
    30      }
    31  
    32      // The library must be loaded after the SetConsoleCtrlHandler call
    33      // so that the library handler registers after the main program.
    34      // This way the library handler gets called first.
    35      HMODULE dummyDll = LoadLibrary("dummy.dll");
    36      if (!dummyDll) {
    37          fprintf(stderr, "ERROR: Could not load dummy.dll");
    38          return 1;
    39      }
    40  
    41      printf("ready\n");
    42      fflush(stdout);
    43  
    44      if (WaitForSingleObject(waitForCtrlBreakEvent, 5000) != WAIT_OBJECT_0) {
    45          fprintf(stderr, "FAILURE: No signal received");
    46          return 1;
    47      }
    48  
    49      return 0;
    50  }