子进程中的SIGSEGV信号处理

时间:2017-01-18 16:48:17

标签: c

我有一个程序可以创建一个fork,它使用execve运行一个具有SegFault的程序,并在捕获信号后退出。在我的信号处理程序中,我应该获得"分段故障(核心转储)"但没有写任何东西。所以我问:如何在子进程中处理段错误信号?我的代码如下:

int     child_management(char **env, char **arguments)
{
  char  **paths;
  char  *current_path;
  char  *target_path;
  int   found;
  int   i;

  i = -1;
  found = 0;
  paths = get_paths(env);
  if (execve(arguments[0], arguments, env) == -1)
    {
      while (paths[++i] != NULL)
        {
          current_path = my_strcat(paths[i], "/");
          target_path = my_strcat(current_path, arguments[0]);
          found = (execve(target_path, arguments, env) == -1 && found == 0) ? 0 : 1;
          free(current_path);
          free(target_path);
        }
      if (!found && !is_existing_builtin(arguments[0]))
        my_printf("%s: Command not found.\n", arguments[0]);
    }
  free(arguments);
  free(paths);
  if (signal(SIGSEGV, segf_handler) == SIG_ERR);
  exit(0);
}

void    segf_handler()
{
  my_printf("Segmentation fault (Core dumped)\n");
}

int     execute_program(char *str, char **av, char **env)
{
  pid_t pid;
  char  **arguments;

  pid = fork();
  arguments = my_str_explode(str, ' ');
  if (pid > 0)
    {
      parent_management(pid, arguments, env);
    }
  else if (pid == 0)
    {
      child_management(env, arguments);
    }
}

请注意我正在做运动而且我不允许使用其他功能而不是信号所以不要告诉我有关sigaction的信息

1 个答案:

答案 0 :(得分:2)

你无法捕捉孩子内部的SEGV信号,因为调用execve会替换孩子在该程序中运行的代码。

然而,当子进程终止时,您可以在父级中捕获CHLD信号。你需要检查从wait()返回的状态,看看它是如何/为什么它会死亡。