title: Handling signals SIGSTP, SIGCONT, SIGINT with child process
body: <p>I'm currently writing a simple shell in C and i'm facing issues with signals.</p>
  
  <p>For example when I launch my program, I type ping command then CTRL-Z I want that the child process (the ping command) to be paused and then to come back when I use fg. </p>
  
  <p>I think that I need to store as a global variable the child pid of the one that execute the ping command.</p>
  
  <p>I already checked other posts to resolve the problem by my own but I can't get it working.</p>
  
  <p>This is the code to execute a command (multiple commands with |) and where I store the child pid.</p>
  
  <pre><code>int exec_proc(int input, int output, char** command) {
  
  pid_t runner;
  
  runner = fork();
  f_pid = runner;
  
  if (runner == 0) {
      // Use input for stdin
      if (input != 0) {
          dup2(input, 0);
          close(input);
      }
  
      // Use output for stdout
      if (output != 1) {
          dup2(output, 1);
          close(output);
      }
      // Return command code
      execvp(command[0], command);
  }
  
  // An error occured
  return -1;
  </code></pre>
  
  <p>This is my handler c file.</p>
  
  <pre><code>pid_t f_pid;
  /**
  * Handles every handler !
  */
  void handlerManager()
  {
      signal(SIGINT,INTHandler);
      signal(SIGTSTP,TSTPHandler);
      signal(SIGCONT,CONTHandler);
  }
  
  /**
   * Handler for CTRL-C
   * @param sig
  */
  void INTHandler(int sig)
  {
      printf("\nDo you really want to quit ? [y/n] \n");
      int answer = getchar();
  
      if(toupper(answer) == 'Y')
          kill(f_pid,SIGINT);
  }
  
  /**
   * Handler for CTRL-Z (processus sleep)
   * @param sig
  */
  void TSTPHandler(int sig)
  {
      printf("\nGoing to sleep! \n");
      printf("%d", f_pid);
      kill(f_pid,SIGTSTP);
  }
  
  /**
     * Handler to reset a processus
     * @param sig
  */
   void CONTHandler(int sig)
   {
       printf("\nHey i'm awake\n");
       kill(f_pid,SIGCONT);
   }`
  </code></pre>
  
  <p>When I print the pid I am getting the right PID.</p>
  
  <p>Finally this where I call my handler Manager.</p>
  
  <pre><code>int main() {
  
  
  char* line;
  char** args[MAX_ARG_SIZE] = {NULL};
  int status;
  
  handlerManager();
  
  do {
  
      fflush(stdin);
  
      prompt();
  
      line = readline();
  
      char linecpy[strlen(line)];
      strcpy(linecpy, line);
  
      splitBy(line, " ", args);
  
      status = exec(args, linecpy);
  
      switch (status) {
          case EMPTY_LINE:
              break;
      }
  
  } while (status);
  
  
  return 0;
  </code></pre>
  
  <p>Thank you in advance and sorry for my english.</p>