#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <signal.h>
#include <sys/wait.h>
#include "../lpi.h"             /*
                                 *  getSigname()  ../defs.c
                                 *  printWaitStatus() ../lpi.c
                                 */
void sig_handler(int signo);

int
main(int argc, char *argv[])
{
    pid_t pid;
    int status;

    switch (pid = fork()) {
    case -1:
        err(EXIT_FAILURE, "fork");

    case 0:

        printf("   PID=%ld about to stop\n", (long) getpid());
        raise(SIGSTOP);
        printf("   PID=%ld continues execution\n", (long) getpid());
        _exit(EXIT_SUCCESS);
    default:
        printf("   PID=%ld forks child with PID=%ld\n",
            (long) getpid(), (long) pid);

        if (signal(SIGCHLD, sig_handler) == SIG_ERR)
            err(EXIT_FAILURE, "signal");

        pid = wait(&status);
        if (pid == -1)
            err(EXIT_FAILURE, "wait");
        printWaitStatus(NULL, status);
    }
    exit(EXIT_SUCCESS);
}

void
sig_handler(int signo)
{
    printf(">> PID=%ld %s occurred\n", (long) getpid(), getSigname(signo));
}
