最后几天,我有点挣扎于分叉进程并从分叉的进程(子进程)中杀死父进程


我不知道为什么,但似乎根本没有杀死父母。首先,由于正常关闭过程而使进程保持运行的开放连接,我很难解决,但这不是那个问题。


如果我从终端向父级发送 SIGTERM,它运行得很好,但是当子级发送 SIGTERM 时它不会停止,强制退出不是正常关闭的选择原因。


编辑 * 进程仍在进程列表中。也许那是为了让父母跟踪它的孩子?


一些执行分叉的代码,也许我在这里做错了什么


func (s *Server) Upgrade() error {

    tl := s.listener.(*listener)


    addr := s.listener.Addr()

    name := fmt.Sprintf("%s:%s->", addr.Network(), addr.String())

    os.Setenv("PROX_NAME", name)


    fl, err := tl.File()

    if err != nil {

        return fmt.Errorf("Failed to extract file desciptor, %v", err)

    }


    fd := fl.Fd()


    argv0, err := exec.LookPath(os.Args[0])

    if err != nil {

        return fmt.Errorf("Failed to execute lookpath, %v", err)

    }


    noCloseOnExec(fd)


    files := make([]*os.File, fd+1)

    files[syscall.Stdin] = os.Stdin

    files[syscall.Stdout] = os.Stdout

    files[syscall.Stderr] = os.Stderr


    files[fd] = os.NewFile(fd, name)


    wd, err := os.Getwd()

    if err != nil {

        return err

    }


    os.Setenv("GPROXY_FD", fmt.Sprintf("%d", fd))

    os.Setenv("GPROXY_PID", fmt.Sprintf("%d", syscall.Getpid()))

    args := []string{"gproxy", "-debug", "start"}

    _, err = os.StartProcess(argv0, args, &os.ProcAttr{

        Dir:   wd,

        Env:   os.Environ(),

        Files: files,

    })


    return err

}

父母的终止


func termParentProcess() error {

    pid := syscall.Getppid()

    return syscall.Kill(pid, syscall.SIGTERM)

}