#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>     // for _exit()
#include <signal.h>
#include <err.h>

void handler(int sig, siginfo_t *siginfo, void *ucontext);

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

    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = handler;

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

    a = 5 / 0;

    exit(EXIT_SUCCESS);
}

void
handler(int sig, siginfo_t *siginfo, void *ucontext)
{
    if (siginfo->si_signo == SIGFPE) {
        printf("%p\n", siginfo->si_addr);
    }
    _exit(EXIT_FAILURE);
}
