如何正确杀死叉子的儿子

时间:2015-05-21 17:20:55

标签: c++ c linux

我正在做自己的shell,但在执行过程中遇到了问题。

在我的fork之后,我做了一个文件的execve,但如果文件不是二进制文件,那么我的儿子不会退出,所以我有一个无限循环。 我知道我可以退出()我的孩子,但我不想使用它。

还有其他任何可能性来杀死它吗?

我已经尝试过kill(pid, SIGTERM);,但它也会杀死父母。

你知道吗?

这是我的代码:

int     son(int *fd_in, int p[2], t_list *cmd, char **env, int pid)
{
  (void)env;
  signal(SIGINT, SIG_DFL);
  if (g_fd != -1)
    {
      dup2(g_fd, 0);
      g_fd = -1;
    }
  dup2(*fd_in, 0);
  if (cmd->act != ENDACT && cmd->act != LEFT && cmd->act != DLEFT)
    dup2(p[1], 1);
  close(p[0]);
  if ((execve(cmd->av[0], cmd->av, env)) == -1)
    {
      kill(pid, SIGTERM);
    }
  return (0);
}

t_list      *execute_pipe(t_list *cmd, int *fd_in, int *status, char **env)
{
  int       p[2];
  pid_t     pid;

  *fd_in = 0;
  while (cmd->act != -1)
    {
      pipe(p);
      if ((pid = fork()) == -1)
    return (NULL);
      else if (pid == 0)
    son(fd_in, p, cmd, env, pid);
      else
    {
      close(p[1]);
      *fd_in = p[0];
      if (cmd->act != PIPE)
        {
          while (waitpid(pid, status, WUNTRACED) > 0);
          return (cmd);
        }
      cmd = cmd->next;
    }
    }
  while (waitpid(pid, status, WUNTRACED) > 0);
  return (cmd);
}

2 个答案:

答案 0 :(得分:1)

最后为了杀死我的过程,我做了kill(getpid(), SIGTERM)并且效果很好。

答案 1 :(得分:-2)

我知道你已经声明你已经尝试过了,但在我看来发送SIGTERM或SIGKILL是最好的方法。

使用“kill(pid,SIGKILL);”语法绝对不应该杀死除pid之外的任何进程。 我唯一的建议是确保在kill调用中使用的pid是儿子的pid,而不是父节点。

同时检查儿子的pid是否被设置为等于对父母pid的引用,因为你可能认为你传递了儿子的pid并且它确实指向父母的pid数据。只是我的想法。

请参阅以下手册页:http://linux.die.net/man/2/kill