C program where parent returns the exit status of child in it’s SIGCHLD signal handler.

C program where parent returns the exit status of child in it’s SIGCHLD signal handler. 

Description:
Both parent and child process run in infinite loop.
Parent process has registered itself  SIGCHLD signal.
Child process has registered itself for SIGTERM signal.
In the SIGTERM signal handler, do exit(0).

Now, do kill -15 to child process.
On the console, you would see that the exit status of child.

Now, comment out signal handler and repeat the above steps.
The exit status of child would change now.

&&&&&&&&&&&&&&&&&&&&&&&&&&
Program:
&&&&&&&&&&&&&&&&&&&&&&&&&&

Neelkanth_98$ cat parent.c
#include <errno.h>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>

void handler(int sig)

{
    pid_t pid;
    int status;

    waitpid(pid, &status, WUNTRACED);

    if (WIFEXITED(status)) {
        printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
        printf("Child process has exited. exit code: %d\n", WEXITSTATUS(status));
        printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
    }

    if (WIFSIGNALED(status)) {
        printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
        printf("stat value: %d Exit status: %d\n", status, WTERMSIG(status));
        psignal(WTERMSIG(status), "Child received Termination signal: "
                "Exit signal");
        printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
    }

}


int main()
{
    pid_t child_pid;
    int status;

    signal(SIGCHLD, handler);

    /* now create new process */
    child_pid = fork();

    if (child_pid >= 0) /* fork succeeded */
    {
        if (child_pid == 0) /* fork() returns 0 for the child process */
        {
            printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
            printf("start child process!\n");
            printf("child PID =  %d, parent pid = %d\n", getpid(), getppid());

            char *cmd[] = {"./child1", "neel", "rockstar", NULL};
            return execvp(cmd[0], cmd); // call child1 process

        }
        else /* parent process */
        {
            printf("*****************************************************\n");
            printf("parent process!\n");
            printf("parent PID =  %d, child pid = %d\n", getpid(), child_pid);

            printf("*****************************************************\n");
            printf("Parent exits now!\n\n");
            printf("*****************************************************\n");
            while(1);  /* parent exits */
        }
    }
    else /* failure */
    {
        perror("fork");
        exit(0);
    }
}


Neelkanth_98$ cat child.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void handler(int sig)
{
    printf("\n CHild: inside child signal handler, do exit(0)  \n");
    exit(0);
}


int main(int argc, char *argv[])
{

    signal(SIGTERM, handler);


    /* the program should take 2 arguments */
    if (((argc >1) && (argc <= 3)))
    {
        printf("process name: %s\n", argv[0]);
        printf("arguments %s %s\n", argv[1], argv[2]);
    } else {
        printf("enter only 2 random strings\n");
        exit(1);
    }

    /* The child process should run indefinitely */

    while(1);

    return 0;
}

Output 

Neelkanth_98$ ./parent
*****************************************************
parent process!
parent PID =  5332, child pid = 5333
*****************************************************
Parent exits now!

*****************************************************
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
start child process!
child PID =  5333, parent pid = 5332
process name: ./child1
arguments neel rockstar

 CHild: inside child signal handler, do exit(0)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Child process has exited. exit code: 0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


^C