0

i am trying to write a program for a basic process control block, the below code shows what i have done in the testing phase,i want to know whether we can resume a child once killed instead of forking a new child again if yes how do we do that. Thanks in advance!
code:
`

    #include<sys/types.h> 
    #include<sys/wait.h>
    #include<unistd.h>
    #include<time.h>
    #include<stdio.h>
    #include<unistd.h>
    #include<time.h>
    #include<stdio.h>
    #include<stdlib.h>
int hell()
    {  
   int j;
   for(j=1;j<6;j++)
   printf("%d hello\n",j);` 
    }  
int hello(k)
    {    
int i
for(i=1;i<15;i++
printf("%5d hello \n", i);

    }  
void sigint()
    {  
    signal(SIGCONT,sigint); /* reset signal */
    printf("CHILD: I have received a SIGINT\n"); 
    }  
int main()
    {
 int i, status;
 pid_t childID, endID,end1id,parentid;
 time_t when;

label: if ((childID = fork()) == -1) {
    perror("fork error");
    exit(EXIT_FAILURE);
 }
else if (childID == 0) {
    time(&when);hell();
    printf("k value %d\n",hello(5));
    printf("Child process started at %s\n", ctime(&when));
    printf("child PID : %d \n",getpid());

    hello();
    sleep(10);
    //kill(childID, SIGKILL);                 

    exit(EXIT_SUCCESS);
 }
 }
else {
    time(&when);
    printf("Parent process started at %s", ctime(&when));
    printf("parent PID : %d\n",getpid());
            hell();
       parentid = getpid();
for(i = 0; i < 15; i++) {
       endID =waitpid(childID,&status,WNOHANG|WUNTRACED);     
    printf("endid: %d\n",endID);
       end1id = waitpid(parentid, &status, WNOHANG|WUNTRACED);    
       if (endID == -1) {  
          perror("waitpid error");
          exit(EXIT_FAILURE);
       }
       else if (endID == 0) {
          time(&when);
          printf("Parent waiting for child at %s", ctime(&when));
          sleep(1);
       }  
       else if (endID == childID) {

          if (WIFEXITED(status))
             printf("Child ended normally\n\n");
          else if (WIFSIGNALED(status)){
        printf("Child ended because of an uncaught signal\n");goto label;}
          else if (WIFSTOPPED(status)){
          printf("Child process has stopped\n");goto label;}
          exit(EXIT_SUCCESS);
       }  
}  
}  

1 Answers1

3

When you issue the kill command to the child you can suspend it using SIGSTOP without making it die then resume it where it left off using SIGCONT.

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main() {
   pid_t childId;

   if ( ( childId = fork() ) == -1 ) {
      printf( "child fork failed\n" );

   } else if ( childId == 0 ) {
      int i = 0;
      while ( 1 ) {
         printf( "infinite child loop ==> %d\n", ++i );
         sleep( 1 );
      }

   } else {
      printf( "parent: child started OK\n" );
      sleep( 5 );
      printf( "parent: stopping child - but letting it live\n" );
      kill( childId, SIGSTOP );
      sleep( 5 );
      printf( "parent: resuming child since it stopped but never really died\n" );
      kill( childId, SIGCONT );
      printf( "parent: child should be running again where it left off\n" );
      sleep( 5 );

   }
}

Output:

parent: child started OK
infinite child loop ==> 1
infinite child loop ==> 2
infinite child loop ==> 3
infinite child loop ==> 4
infinite child loop ==> 5
infinite child loop ==> 6
parent: stopping child - but letting it live
parent: resuming child since it stopped but never really died
parent: child should be running again where it left off
infinite child loop ==> 7
infinite child loop ==> 8
infinite child loop ==> 9
infinite child loop ==> 10
infinite child loop ==> 11
infinite child loop ==> 12
T Johnson
  • 824
  • 1
  • 5
  • 10
  • thank you i understood what your trying to convey but this has brought another doubt.... what if the child was killed abruptly as in a interrupt? For example:i am executing this code from one terminal and from another i kill the process using the kill cmd with the child pid..?.. i hope your getting my point.. – Mandadi Pranav May 16 '16 at 08:28
  • The kill command is poorly named. It send signals and the receipt of the signal may or may not cause the process to exit. It depends on which signal it is. Also, your process can handle some signals but not others like SIGSTOP. – T Johnson May 16 '16 at 11:10