#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <err.h>
#include "../lpi.c"         // for getSigname()
                            // implemented in ../defs.c
void
handler(int signo)
{
    printf("%s caught\n", getSigname(signo));
}

int
main(int argc, char *argv[])
{
    int i, n;
    struct sigaction sa;

    n = 10;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = handler;

    if (sigaction(SIGABRT, &sa, NULL) == -1)
        err(EXIT_FAILURE, "sigaction");

    printf("established a signal handler for SIGABRT\n");
    printf("this handler returns normally\n");

    printf("raise() %d SIGABRT\n", n);
    for (i = 0; i < n; i++) {
        printf("raised signal SIGABRT #%d\n", i);
        raise(SIGABRT);
        sleep(2);
    }

    printf("now call abort()\n");
    abort();

    printf("programmed ended successfully.");   // UNREACHABLE
    exit(EXIT_SUCCESS);
}
