Answer:
Complete code is given below:
Explanation:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <sys/wait.h>
int main(int argc , char *argv[]){
pid_t mypid, childpid;
int status;
int i,n;
time_t t;
mypid = getpid();
printf("pid is %d.\n", mypid);
childpid = fork();
if ( childpid == -1 ) {
perror("Cannot proceed. fork() error");
return 1;
}
if (childpid == 0) {
mypid = getpid();
childpid = fork();
if ( childpid == -1 ) {
perror("Cannot proceed. fork() error");
return 1;
}
if (childpid == 0) {
mypid = getpid();
printf("Child pid is %d.\n", getppid());
childpid = fork();
if ( childpid == -1 ) {
perror("Cannot proceed. fork() error");
return 1;
}
random((unsigned) time(&t));
printf(" parent id = %d : Random = %d\n",mypid , (int)(random()% 100 +1));
printf("child id = %d : Random = %d\n",getpid , (int)(random()% 100 +1));
if (childpid == 0) {
printf("Child 2: I hinerited my parent's PID as %d.\n", mypid);
mypid = getpid();
printf("Child 2: getppid() tells my parent is %d. My own pid instead is %d.\n", getppid(), mypid);
sleep(30);
return 12;
} else return 15;
} else {
while ( waitpid(childpid, &status,0) == 0 ) sleep(1);
if ( WIFEXITED(status) ) printf("Child 1 exited with exit status %d.\n", WEXITSTATUS(status));
else printf("Child 1: child has not terminated correctly.\n");
}
} else {
printf(" fork() is ok and child pid is %d\n", childpid);
wait(&status);
if ( WIFEXITED(status) ) printf(" child has exited with status %d.\n", WEXITSTATUS(status));
else printf(" child has not terminated normally.\n");
}
return 0;
}
Output:
pid is 24503.
Child pid is 24565.
parent id = 24566 : Random = 87
child id = 1849900480 : Random = 78
pid is 24503.
Child 1 exited with exit status 15.
pid is 24503.
fork() is ok and child pid is 24565
child has exited with status 0.