c сообщением о том, какой сигнал прервал ребенок - PullRequest
0 голосов
/ 11 мая 2018

Я довольно много работал над оболочкой, и теперь я пытаюсь обновить этот код, чтобы он сообщал, когда дочерний элемент был прерван сигналом (кроме SIGINT). Я также пытаюсь сообщить о "дампе ядра", если это произошло в скобках (аналогично bash).

   ...

   if(test == -1){ 
      cpid = fork();
      if(cpid < 0){
         //Fork wasn't successful 
         perror("fork");
         free(argList);
         return -1;
      }

      if(cpid == 0){
         //We are the child!
         close(pipefd[0]);
         dup2(pipefd[1], 1);

         execvp(args[0], args);         
         //execvp returned, wasn't successful
         perror("exec");
         fclose(stdin);  
         exit(127);
      }
      close(pipefd[1]);

      //Have the parent wait for child to complete, if flags allow 
      if(strcmp(flags, "NOWAIT") != 0){

         if(wait (&status) < 0){
            //Wait wasn't successful
            perror("wait");
         }
         else{


////////////////////////////////////////////////////////
        //report if a child has been terminated by a signal other than SIGINT
        if((WIFSTOPPED(status) && (WSTOPSIG(status) != SIGINT))){

           printf("child terminated by signal [%d]\n", WSTOPSIG(status));

           if(WCOREDUMP(status)){
              printf("core dumped\n");
           }
        }
//////////////////////////////////////////////////////////

           free(argList);
           //since no child is running, return 0
           return 0;
         }
      }
      else{
         //if a child is running, return the child's pid
         return cpid;
      } 
   }

   ...

Я не совсем уверен, как поступить с этим. Я впервые много работаю с командой fork (), и мои знания об отношениях между родителями и ребенком довольно скудны, если честно. Я искал ответы, и самое близкое, что я получил, это то, что SIGCHLD обрабатывает подобные вещи, но мне нужно иметь возможность распечатать конкретное число. что-то вроде:

printf("child terminated (%d)\n", 15 + signal);

редактировать *
Я помещаю то, что я считаю правильной реализацией того, что я хочу, в код, окруженный ////////

1 Ответ

0 голосов
/ 11 мая 2018

Вы получаете статус ребенка с выбранным вами вариантом wait() или waitpid() - или по BSD wait3() или wait4(), если хотите - и затем анализируете статус.

POSIX предоставляет:

  • WIFEXITED(status) - возвращает true, если программа вышла из-под контроля.
  • WEXITSTATUS(status) - возвращает состояние выхода (0..255).
  • WIFSIGNALED(status) - возвращает true, если программа вышла из-за сигнала.
  • WTERMSIG(status) - возвращает сигнал завершения.

  • WIFSTOPPED(status) - если ребенок был остановлен сигналом.

  • WSTOPSIG(status) - сигнал, который остановил ребенка.
  • WIFCONTINUED(status) - если ребенок продолжилпоскольку сигнал останова.

POSIX не определяет, но многие реализации на основе Unix обеспечивают:

  • WCOREDUMP(status) - возвращает true, если ядро ​​было сброшено.
...