Tuesday 5 April 2016

C Program for Fork in Linux

Q: Write a program in C for linux fork system call. Also show zoombie and orphaned processes.

The use of fork system call is displayed using the following two programs




Fork1



#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
int main(int argc,char *argv[]) {
 int valpid;
 printf("\nStudy of fork system call");
 printf("\nBefore fork");
 printf("\nPPID=%d\tPID=%d",getppid(),getpid());
 printf("\n....................................");
 fflush(NULL);  //this prevents double printing of the earliear line
 valpid=fork();
 printf("\nAfter fork");
 if(valpid>0){
  fflush(NULL);
  sleep(2);
  printf("\nThis is from parent with pid=%d",getpid());
  printf("\nThis is from the parent with ppid=%d",getppid());
  printf("\nValue returned by fork system call is%d",valpid);
  printf("\nThe parent process will now be terminated");
  exit(1);
 }
 else if(valpid==0){
  printf("\nThis is from the child with pid=%d",getpid());
  printf("\nThis is from the child with ppid=%d",getppid());
  printf("\nValue returned by fork system call is%d",valpid);
  printf("\nThe child process is now sleeping for 5seconds");
  fflush(NULL); //to print the above printf statement before sleeping
  sleep(5);
  printf("\nThe value of child process ppid after termination of parent process is%d",getppid());
 }
 else{
  printf("\nError condition");
  printf("\nFork Unsuccessful");
}
 printf("\nEnd of program\n");
 return 0;
}

Fork1 output

Study of fork system call
Before fork
PPID=1503    PID=1897
....................................
After fork
After fork
This is from the child with pid=1898
This is from the child with ppid=1897
Value returned by fork system call is0
The child process is now sleeping for 5seconds
This is from parent with pid=1897
This is from the parent with ppid=1503
Value returned by fork system call is1898
The parent process will now be terminated[student@localhost grpb]$
The value of child process ppid after termination of parent process is1
End of program

Fork2

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
int main(int argc,char *argv[]) {
 int valpid;
 printf("\nStudy of fork system call");
 printf("\nBefore fork");
 printf("\nPPID=%d\tPID=%d",getppid(),getpid());
 printf("\n....................................");
 fflush(NULL);  //this prevents double printing of the earliear line
 valpid=fork();
 printf("\nAfter fork");
 fflush(NULL);
 if(valpid>0){
  printf("\nThis is from parent with pid=%d",getpid());
  printf("\nThis is from the parent with ppid=%d",getppid());
  fflush(NULL);
  sleep(5);
  printf("State of the process after the execution of the child is finished\n");
  system("ps -l");
  fflush(NULL);
 }
 else if(valpid==0){
  printf("\nThis is from the child with pid=%d",getpid());
  printf("\nThis is from the child with ppid=%d\n",getppid());
  printf("This is the state of the process while child process is yet to execute\n");
  system("ps -l");
  fflush(NULL);
 }
 else{
  printf("\nError condition");
  printf("\nFork Unsuccessful");
}

 printf("\nEnd of program\n");
 fflush(NULL);
 return 0;
}



Fork2 output

[student@localhost grpb]$ gcc fork2.c
[student@localhost grpb]$ ./a.out

Study of fork system call
Before fork
PPID=1503    PID=2459
....................................
After fork
This is from parent with pid=2459
This is from the parent with ppid=1503
After fork
This is from the child with pid=2460
This is from the child with ppid=2459
This is the state of the process while child process is yet to execute
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1017  1503  1498  0  80   0 - 29014 wait   pts/0    00:00:00 bash
0 T  1017  1734  1503  0  80   0 - 26716 signal pts/0    00:00:00 cat
0 T  1017  1844  1503  0  80   0 - 29705 signal pts/0    00:00:00 man
0 T  1017  1860  1844  0  80   0 - 27901 signal pts/0    00:00:00 less
0 S  1017  2459  1503  0  80   0 -  1028 hrtime pts/0    00:00:00 a.out
1 S  1017  2460  2459  0  80   0 -  1028 wait   pts/0    00:00:00 a.out
0 R  1017  2461  2460  0  80   0 - 28409 -      pts/0    00:00:00 ps
End of program
State of the process after the execution of the child is finished
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1017  1503  1498  0  80   0 - 29014 wait   pts/0    00:00:00 bash
0 T  1017  1734  1503  0  80   0 - 26716 signal pts/0    00:00:00 cat
0 T  1017  1844  1503  0  80   0 - 29705 signal pts/0    00:00:00 man
0 T  1017  1860  1844  0  80   0 - 27901 signal pts/0    00:00:00 less
0 S  1017  2459  1503  0  80   0 -  1028 wait   pts/0    00:00:00 a.out
1 Z  1017  2460  2459  0  80   0 -     0 exit   pts/0    00:00:00 a.out <defunct>
0 R  1017  2462  2459  0  80   0 - 28409 -      pts/0    00:00:00 ps
End of program

[student@localhost grpb]$ 




No comments:

Post a Comment