如何正确地杀死叉子的儿子

How to killing the son of a fork properly

本文关键字:儿子 正确地      更新时间:2023-10-16

我正在做我自己的shell,但是在执行过程中我有问题。

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

还有其他杀死它的方法吗?

我已经尝试了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);
}

最后结束我的进程,我做了kill(getpid(), SIGTERM),它运行良好。

我知道您已经说过您尝试过了,但是在我看来,向它发送SIGTERM或SIGKILL是最好的方法。

使用"kill(pid, SIGKILL);"语法绝对不应该杀死任何进程,除了等于pid的进程。我唯一的建议是确保在kill调用中使用的pid是子进程的,而不是父进程的。

还要检查子进程的pid是否被设置为与父进程的pid的引用相等,因为你可能认为你传递的是子进程的pid,而实际上它指向父进程的pid数据。只是我的想法。

参见以下手册:http://linux.die.net/man/2/kill