亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 不能殺死子進程的父進程

Golang 不能殺死子進程的父進程

Go
Cats萌萌 2021-08-16 19:10:39
最后幾天,我有點掙扎于分叉進程并從分叉的進程(子進程)中殺死父進程我不知道為什么,但似乎根本沒有殺死父母。首先,由于正常關閉過程而使進程保持運行的開放連接,我很難解決,但這不是那個問題。如果我從終端向父級發送 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)}
查看完整描述

2 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

我的父進程不會在 TERM 信號上終止的問題是因為內部 for 循環不會中斷。我修復了 for 循環并讓 main 函數返回。如果在 Go 中 main 返回,則程序退出。很抱歉因為我自己的一個大錯誤而打擾你們


查看完整回答
反對 回復 2021-08-16
  • 2 回答
  • 0 關注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號