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