Estou usando Ubuntu (Linux).
Tenho os dois programas simples a seguir.
Pai:
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)
}
}
Criança (criança em seu próprio grupo):
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println("hi from child")
time.Sleep(time.Second * 20)
}
}
Após iniciar o programa pai ( ./parent
), o resultado da chamada do comando ps
(especificamente, ps -t /dev/pts/0 -o pid,ppid,pgid,stat,comm
) é o seguinte:
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss bash
467049 466922 467049 Sl+ parent
467054 467049 467054 Sl child
Após terminar o processo pai (com kill -SIGKILL 467049
, kill -SIGINT 467049
ou CTRL-C
), o filho continua a trabalhar (estado S/R). É exatamente isso que eu espero.
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss+ bash
467054 467049 467054 Sl child
O que me confunde é o seguinte cenário. Primeiro, eu inicio o processo pai ( ./parent
). O resultado do ps
comando é o mesmo do caso anterior. Então eu suspendo o processo filho com kill -SIGTSTP 467054
ou kill -SIGSTOP 467054
. O resultado do ps
comando é o seguinte:
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss bash
467049 466922 467049 Sl+ parent
467054 467049 467054 Tl child
Então, eu termino o processo pai (com kill -SIGKILL 467049
, kill -SIGINT 467049
ou CTRL-C
). Por alguma razão, neste caso o filho também é terminado! Resultado do ps
comando:
PID PPID PGID STAT COMMAND
466922 466896 466922 Ss+ bash
Como? Por quê?
Obrigado, Stéphane Chazelas . Citar de _exit :