如何在父进程中捕获Term动作信号?

时间:2014-10-09 11:48:29

标签: c++ c linux process signals

我是LINUX C编程的新手,我的任务是编写一个关于进程的程序。

我需要处理两个进程,父进程和子进程。

我的目标是让父分叉一个进程(子进程),然后子进程执行一个可能终止失败的程序。父进程等待子进程终止,并获取从子信号启动的信号,如中止或分段错误。

但是,我遇到了一些问题。

我发现"核心行动"信号可以很容易地被检测到,但是"术语动作"无法检测到!!

"定期行动"信号,例如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 ; 
}

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分: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 ; 
}

信号并不总是结束一个程序,使你的条件毫无意义。

答案 1 :(得分: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>)。