Как поймать сигнал действия термина в родительском процессе?

0

Я новичок в программировании LINUX C, моя задача - написать программу о процессе.

Мне нужно обрабатывать два процесса: родительский и дочерний.

Моя цель - разрешить родительскому процессу процесс (дочерний процесс), а затем дочерний процесс для выполнения программы, которая может завершиться сбой. Родительский процесс ждет дочерний процесс, чтобы завершить работу, и получить сигнал, который запускается из дочернего сигнала, например, прервать или сегментировать ошибку.

Однако я сталкиваюсь с некоторыми проблемами.

Я обнаружил, что сигнал "Core Action" может быть легко обнаружен, но "Term action" не может быть обнаружен !!

Сигнал "Term action", такой как SIGALRM (14) или SIGINT (2), не может быть обнаружен. Кажется, это классифицируется как завершенный успех.

Вот мой код:

#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <cstring>
#include <errno.h>
using namespace std;


bool check = true; 

void mySignal( int sig ){
    int status; 
    pid_t childPid = wait( &status ) ; 


    if( WIFEXITED( status ) ){
        printf("The child is terminated success!!\n"); 
    }
    else{
        if( WIFSIGNALED( status ) ){
            int termsig = WTERMSIG( status ) ;
            printf("termsig = %d %d\n",status, termsig ) ;  
        }
    }
    check = false ; 
}


int main( int argc , char *argv[] ){

    signal( SIGCHLD, mySignal ) ; 
    pid_t pid = fork() ; 


    if( pid < 0 ){
        printf("fork error\n");
        exit( -1 ) ;
    }
    else if( pid == 0 ){
        execl( argv[1], NULL );
        exit( 0 ) ;
    }

    while( check ) ; 
    return 0 ; 
}

Кто-нибудь знает, как решить эту проблему??

Теги:
signals
process

2 ответа

0

Вы должны сделать что-то вроде этого:

if(WEXITED(status)){
  printf("Child %d exited with exit code %d.\n", (int)pid, WEXITSTATUS(status));
  // Note that a non-zero exit status normally indicates some kind of error.
}
else if(WIFSIGNALED(status)){
  printf(
    "Child %d terminated with signal %d, with%s a core dump.\n",
    (int)pid, WTERMSIG(status), WCOREDUMP(status)? "": "out"
  );
}
else if(WSTOPPED(status)){
  printf("Child %d was stopped by signal %d.\n", (int)pid, WSTOPSIG(status));
}
else{
  fprintf(stderr, "Unexpected signal condition.\n");
}

Как отмечалось выше, ненулевой статус выхода обычно указывает на ошибку. Так вы должны сделать в своем коде: exit(0) сразу после execl() будет выполняться только в том случае, если вызов execl() завершается с ошибкой, поэтому вы скорее скажете что-то вроде exit(1) или exit(EX_UNAVAILABLE) (из <sysexits.h>).

  • 0
    Ой!!!!!! Так вот как это !!!! Спасибо за Ваш ответ :)
  • 0
    Но, наконец, я обнаружил, что в моей программе тестирования аварийных сигналов что-то не так, поэтому мой родительский процесс не может получить сигнал SIGALRM XD
0
void mySignal( int sig ){
  int status; 
  pid_t childPid = wait( &status ) ; 


  if( WIFEXITED( status ) ){
     printf("The child is terminated success!!\n"); 
  }

  if( WIFSIGNALED( status ) ){
     int termsig = WTERMSIG( status ) ;
     printf("termsig = %d %d\n",status, termsig ) ;  
  }
  check = false ; 
}

Сигнал не всегда заканчивается программой, что делает ваше условное бессмысленным.

  • 0
    Ой!! Спасибо за ваше напоминание! Я буду рассматривать этот вопрос :)
  • 0
    @ChihMin не забудьте подтвердить ответ, если кто-то решил вашу проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню