我正在使用 Ubuntu(Linux)。
我有以下两个简单的程序。
家长:
package main
import (
"fmt"
"syscall"
"time"
)
func main() {
attr := &syscall.ProcAttr{
Files: []uintptr{0, 1, 2},
Sys: &syscall.SysProcAttr{ // child in its own group
Setpgid: true,
Pgid: 0,
},
}
_, err := syscall.ForkExec("./child/child", []string{"child"}, attr)
if err != nil {
fmt.Println("Error:", err)
return
}
for {
fmt.Println("Parent is live")
time.Sleep(10 * time.Second)
}
}
儿童(同组儿童):
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println("hi from child")
time.Sleep(time.Second * 20)
}
}
启动父程序()后,调用(具体来说)命令./parent
的结果如下:ps
ps -t /dev/pts/0 -o pid,ppid,pgid,stat,comm
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss bash
467049 466922 467049 Sl+ parent
467054 467049 467054 Sl child
终止父进程(使用或kill -SIGKILL 467049
)后,子进程继续工作(S/R 状态)。这正是我所期望的。kill -SIGINT 467049
CTRL-C
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss+ bash
467054 467049 467054 Sl child
让我感到困惑的是以下场景。首先,我启动父进程(./parent
)。ps
命令的结果与前一种情况相同。然后我使用kill -SIGTSTP 467054
或暂停子进程kill -SIGSTOP 467054
。命令的结果ps
如下:
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss bash
467049 466922 467049 Sl+ parent
467054 467049 467054 Tl child
然后,我终止父进程(使用或kill -SIGKILL 467049
)。出于某种原因,在这种情况下子进程也会被终止!命令结果:kill -SIGINT 467049
CTRL-C
ps
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss+ bash
怎么办?为什么?
谢谢,Stéphane Chazelas。引用自_exit: