接收SIGSEGV后如何使子进程异常退出?

时间:2017-06-03 19:58:41

标签: c linux process

我写了一个程序,故意让子进程触发SIGSEGV。但是,我希望子进程异常终止。现在我在信号处理程序中使用exit()。但是exit()调用将始终生成正常终止。我应该使用哪种功能来实现这一目标?另一个问题是如何让父进程知道子进程因SIGSEGV而终止?

extern char  etext, edata, end;
void handler() {
  pid_t pid;
  pid = getpid();

  char buf[100];
  snprintf(buf, 100, "child %d terminated by signal 11", (int)pid);
  psignal(SIGSEGV, buf);
  exit(-1);
}

int main(int argc, char **argv) {
  if (signal(SIGSEGV, handler) == SIG_ERR) {
    perror("signal error");
  }

  printf("First address beyond:\n");
  printf("    program text segment(etext)      %10p\n", &etext);
  printf("    initialized data segment(edata)  %10p\n", &edata);
  printf("    uninitialized data segment (end) %10p\n", &end);

  if (fork() == 0) {
    printf("from Child before\n");
    etext = 'a';
    printf("from Child after\n");
  } else {
    pid_t pid;
    int status;
    if ((pid == waitpid(-1, &status, 0)) >= 0) {
      printf("Handler reaped child %d\n", (int)pid);
    }
    printf("child WIFEXITED = %d, WEXITSTATUS = %d\n", WIFEXITED(status), WEXITSTATUS(status));
    if (WEXITSTATUS(status) == -3) {
      printf("Capture the exit code\n");
    }
  }

1 个答案:

答案 0 :(得分:2)

  1. 要让孩子通过信号退出,取消注册处理程序,取消阻止信号,然后Get-Content .\OutputFile.txt | % { if ($_ -eq 'Warning message') { 'NEW WARNING' } else { $_ } }

    raise

    例如,如果您处于该信号的处理程序中,则需要取消阻止。建议使用// unregister SIGSEGV handler signal(SIGSEGV, SIG_DFL); // unblock SIGSEGV sigset_t mask; sigemptyset (&mask); sigaddset (&mask, SIGSEGV); if (sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0) perror ("Could not unblock"); // raise SIGSEGV raise (SIGSEGV); 代替普通C标准sigaction,但此处未显示。

  2. 检查父进程中是否有孩子被信号终止:

    signal