summaryrefslogtreecommitdiffstats
path: root/winsup/testsuite/winsup.api/resethand.c
blob: c8b92b2420fbf94f5faf34ba3d138ee766d3ce79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>

int doit = 0;
void
ouch (int sig)
{
  fprintf (stderr, "ouch %d\n", sig);
  if (doit++ == 0)
    kill (getpid (), SIGTERM);
}

int
main (int argc, char **argv)
{
  static struct sigaction act;
  if (argc == 1)
    act.sa_flags = SA_RESETHAND;
  act.sa_handler = ouch;
  sigaction (SIGTERM, &act, NULL);
  int pid = fork ();
  int status;
  if (pid > 0)
    waitpid (pid, &status, 0);
  else
    {
      kill (getpid (), SIGTERM);
      exit (0x27);
    }
  fprintf (stderr, "pid %d exited with status %p\n", pid, status);
  exit (argc == 1 ? !(status == SIGTERM) : !(status == 0x2700));
}