Estou usando Linux (Ubuntu).
Quando digito man 7 signal
(manual 2020-12-21) no meu terminal, encontro o seguinte para o SIGCHLD:
SIGCHLD P1990 Ign Child stopped or terminated
Então, ele afirma que o SIGCHLD
sinal é gerado somente nesses dois casos. Ele não diz nada sobre quando o processo filho continua.
Entretanto, no POSIX, é afirmado o seguinte:
SIGCHLD Child process terminated, stopped,
[XSI] or continued.
Assim, quando o SO suporta XSI, esse sinal também é gerado quando o filho continua. Eu também escrevo alguns programas filho/pai simples e posso confirmar isso. Já que o Linux suporta XSI, por que o manual não inclui o cenário "continue" para o SIGCHLD também? Qual é o propósito do manual quando ele está incompleto (ou estou perdendo seu propósito?)
Também encontrei as seguintes respostas para SIGCHLD incompletas.
Abaixo está o código. É um código golang simples. O pai inicia o filho por meio do clássico fork/exec. Ele então registra um manipulador para o sinal SIGCHLD e pronto. Tanto o pai quanto o filho imprimem uma mensagem a cada 10 segundos. Depois de construir os dois programas, eu os executo via ./parent
comando. Eu controlo o comportamento ( T
<-> R/S
estado) do processo filho por meio de kill -SISTOP child_process_id
and kill -SIGCONT child_process_id
.
Pai:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
attr := &syscall.ProcAttr{
Files: []uintptr{0, 1, 2},
}
_, err := syscall.ForkExec("./child/child", []string{"child"}, attr)
if err != nil {
fmt.Println("Error:", err)
return
}
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGCHLD)
go func() {
for {
select {
case <-ch:
fmt.Println("SIGNAL")
}
}
}()
for {
fmt.Println("Parent is live")
time.Sleep(10 * time.Second)
}
}
Criança:
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println("hi from child")
time.Sleep(time.Second * 10)
}
}
O texto foi corrigido no repositório upstream linux-man :
Pode levar algum tempo até que o pacote man-pages seja atualizado no seu sistema para que você possa clonar o repositório de desenvolvimento e ter a versão mais recente do manpage no seu sistema:
Para responder ao "por que não" no título da sua pergunta, eu diria que a
signal(7)
página do manual não é o lugar para procurar um catálogo abrangente de todas as maneiras como o kernel usa um sinal em particular. A página do manual fornece apenas uma breve descrição do significado de cada sinal. Isso é consistente com outros tópicos complexos e detalhados, como gdb(1) e awk , cujas páginas do manual apenas explicam o comando e as opções de linha de comando em termos básicos e gerais. A cobertura completa e aprofundada é deixada para livros e sites de tamanho considerável .As páginas de manual são limitadas na quantidade e complexidade das informações que podem transmitir. Para comandos simples, as páginas de manual são adequadas. Como tudo na computação, as páginas de manual têm pontos fortes e fracos. Elas são boas para documentar algumas coisas e ruins para documentar outras. Para componentes internos do SO, como sinais, elas não são adequadas e esperar que as páginas de manual expliquem tudo completamente só vai decepcioná-lo.