AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 790116
Accepted
Yakog
Yakog
Asked: 2025-01-25 22:39:33 +0800 CST2025-01-25 22:39:33 +0800 CST 2025-01-25 22:39:33 +0800 CST

Por que o manual do Linux não diz nada sobre gerar um sinal SIGCHLD quando o filho retoma a execução?

  • 772

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 SIGCHLDsinal é 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 ./parentcomando. Eu controlo o comportamento ( T<-> R/Sestado) do processo filho por meio de kill -SISTOP child_process_idand 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)
    }
}
signals
  • 2 2 respostas
  • 85 Views

2 respostas

  • Voted
  1. Best Answer
    Arkadiusz Drabczyk
    2025-02-02T21:30:01+08:002025-02-02T21:30:01+08:00

    O texto foi corrigido no repositório upstream linux-man :

    commit ac93c406a779bd0def5817d78c30f8a25bb318b9 (origin/contrib)
    Author: Arkadiusz Drabczyk <[email protected]>
    Date:   Sun Feb 2 14:03:31 2025 +0100
    
        man/man7/signal.7: Update definition of SIGCHLD for POSIX.1-2001
    
        This is an XSI extension supported by Linux.
    
        Link: <https://unix.stackexchange.com/q/790116/72304>
        Link: <https://lore.kernel.org/linux-man/Z5U0Wh_KF3Ki62Pk@comp../>
        Signed-off-by: Arkadiusz Drabczyk <[email protected]>
        Message-ID: <[email protected]>
        Signed-off-by: Alejandro Colomar <[email protected]>
    
    diff --git a/man/man7/signal.7 b/man/man7/signal.7
    index dd04c6d1a..83251e071 100644
    --- a/man/man7/signal.7
    +++ b/man/man7/signal.7
    @@ -360,7 +360,8 @@ Linux supports the standard signals listed below.
     The second column of the table indicates which standard (if any)
     specified the signal: "P1990" indicates that the signal is described
     in the original POSIX.1-1990 standard;
    -"P2001" indicates that the signal was added in SUSv2 and POSIX.1-2001.
    +"P2001" indicates that the signal was added or its definition changed
    +in SUSv2 and POSIX.1-2001.
     .TS
     l c c l
     ____
    @@ -369,7 +370,7 @@ Signal      Standard        Action  Comment
     SIGABRT        P1990   Core    Abort signal from \fBabort\fP(3)
     SIGALRM        P1990   Term    Timer signal from \fBalarm\fP(2)
     SIGBUS P2001   Core    Bus error (bad memory access)
    -SIGCHLD        P1990   Ign     Child stopped or terminated
    +SIGCHLD        P2001   Ign     Child stopped, terminated, or continued
     SIGCLD \-      Ign     A synonym for \fBSIGCHLD\fP
     SIGCONT        P1990   Cont    Continue if stopped
     SIGEMT \-      Term    Emulator trap
    

    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:

    $ git -c http.sslVerify=false clone https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git
    Cloning into 'man-pages'...
    Fetching objects: 166851, done.
    Checking connectivity: 166851, done.
    $ cd man-pages
    $ git checkout ac93c406a779bd0def5817d78c30f8a25bb318b9
    Note: switching to 'ac93c406a779bd0def5817d78c30f8a25bb318b9'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by switching back to a branch.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -c with the switch command. Example:
    
      git switch -c <new-branch-name>
    
    Or undo this operation with:
    
      git switch -
    
    Turn off this advice by setting config variable advice.detachedHead to false
    
    HEAD is now at ac93c406a man/man7/signal.7: Update definition of SIGCHLD for POSIX.1-2001
    $ man ./man/man7/signal.7 | less '+/SIGCHLD'
    
    • 1
  2. Sotto Voce
    2025-01-26T03:13:04+08:002025-01-26T03:13:04+08:00

    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.

    • 0

relate perguntas

  • Como restringir o sinal de interrupção apenas ao processo filho?

  • O manipulador de armadilhas não está funcionando?

  • Manipulando o SIGALRM de duas maneiras diferentes

  • Por que o SIGTSTP existe quando já existe o SIGSTOP?

  • Qual número de 1 a 64 é o número do sinal de depuração?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve