Actual source code: ex1.c

  1: static char help[] = "Tests signal handling.\n\n";

  3: #include <petscsys.h>
  4: #include <signal.h>

  6: typedef struct _handlerCtx {
  7:   int exitHandler;
  8:   int signum;
  9: } HandlerCtx;

 11: PetscErrorCode handleSignal(int signum, void *ctx)
 12: {
 13:   HandlerCtx *user = (HandlerCtx *)ctx;

 15:   user->signum = signum;
 16:   if (signum == SIGHUP) user->exitHandler = 1;
 17:   return PETSC_SUCCESS;
 18: }

 20: int main(int argc, char *args[])
 21: {
 22:   HandlerCtx user;

 24:   user.exitHandler = 0;

 26:   PetscFunctionBeginUser;
 27:   PetscCall(PetscInitialize(&argc, &args, (char *)0, help));
 28:   PetscCall(PetscPushSignalHandler(handleSignal, &user));
 29:   while (!user.exitHandler) {
 30:     if (user.signum > 0) {
 31:       PetscCall(PetscPrintf(PETSC_COMM_SELF, "Caught signal %d\n", user.signum));
 32:       user.signum = -1;
 33:     }
 34:   }
 35:   PetscCall(PetscPopSignalHandler());
 36:   PetscCall(PetscFinalize());
 37:   return 0;
 38: }

 40: /*TEST

 42:    build:
 43:      requires: !defined(PETSC_MISSING_SIGHUP)

 45:    test:
 46:      TODO: need to send a signal to the process to kill it from the test harness

 48: TEST*/