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 / 781232
Accepted
CarmenCarmen
CarmenCarmen
Asked: 2024-08-02 09:49:20 +0800 CST2024-08-02 09:49:20 +0800 CST 2024-08-02 09:49:20 +0800 CST

Por que ter o SIGPIPE quando existe o EPIPE?

  • 772

De acordo com pipe(7):

Se todos os descritores de arquivo referentes à extremidade de leitura de um pipe tiverem sido fechados, então a write(2)fará com que um SIGPIPEsinal seja gerado para o processo de chamada. Se o processo de chamada estiver ignorando esse sinal, write(2)falhará com o erro EPIPE.

Por que o Unix precisa ter o SIGPIPEsinal quando write()pode simplesmente retornar EPIPEdiretamente? Meu entendimento é que os sinais são destinados a coisas que são inerentemente assíncronas (por exemplo, encerramento de um filho, interrupção terminal). Mas SIGPIPEsó é gerado como o resultado imediato de uma chamada to write(); nesse caso, ele sempre pode simplesmente retornar EPIPEto to caller para indicar o erro ao chamador.

Por que foi considerado necessário ter SIGPIPEalém de EPIPE?

pipe
  • 3 3 respostas
  • 543 Views

3 respostas

  • Voted
  1. Best Answer
    G-Man Says 'Reinstate Monica'
    2024-08-02T12:32:06+08:002024-08-02T12:32:06+08:00

    Alguns programadores não se preocupam em verificar erros. Alguns programas geram grandes quantidades de saída com  printf (ou, talvez,  write) sem verificar o retorno de um erro. Tal programa poderia ser executado inutilmente até a conclusão, com a saída indo para o balde de bits, se estiver gravando em um canal quebrado.

    SIGPIPE força o encerramento de tal programa (assumindo que ele não capte ou ignore o sinal).

    • 8
  2. Gilles 'SO- stop being evil'
    2024-08-03T04:56:00+08:002024-08-03T04:56:00+08:00

    Isso remonta aos primeiros dias do Unix. Douglas McIlroy , que era o chefe do departamento do Bell Labs onde o Unix foi criado, e que havia trabalhado em outros sistemas incluindo o Multics, estava muito interessado em ter formas úteis de combinar programas. Conforme descrito em A Criação do Sistema Operacional UNIX — Conectando fluxos como uma mangueira de jardim :

    "Se você pensa em macros", explicou McIlroy, "elas envolvem principalmente a troca de fluxos de dados. Quero dizer, você está recebendo informações e de repente chega a uma chamada de macro, e isso diz: 'Pare de receber informações daqui e vá pegá-las'. de lá.'

    Em A Research UNIX Reader: Annotated Trechos from the Programmer's Manual, 1971-1986 , McIlroy explica que

    O aparecimento dos tubos elevou o design standard-in-standard-out ao estatuto de “filosofia” (…)

    Em uma noite febril, Ken [Thompson] escreveu e instalou a chamada de sistema pipe, adicionou pipes ao shell e modificou vários utilitários (…), para serem usados ​​como filtros. (…) Em última análise, os canais afectaram a nossa perspectiva sobre a concepção do programa de forma muito mais profunda do que a ideia original de entradas e saídas padrão redireccionáveis.

    Portanto, a ideia dos pipelines veio primeiro, e a pipechamada do sistema foi uma forma de implementá-la. Pipelines apareceram no Unix v3. Antes disso, encadear programas exigia o uso de um arquivo temporário para a saída do primeiro programa, passando-o como entrada para o segundo programa e, finalmente, removendo o arquivo temporário.

    Agora, se a sua filosofia de programas é que eles se destinam a consumir entradas e produzir saídas, o que você faz se a saída de um programa parar de ser consumida? O programa não é mais útil, então você o mata. Daí o que evoluiu para o sinal SIGPIPE. Como alguns programas têm um comportamento útil que vai além de gravar conteúdo na saída padrão, eles podem solicitar que não sejam eliminados se a saída padrão desaparecer. Esses programas observam um erro EPIPE. Mas como os pipes são uma ferramenta fundamental, ser morto é o comportamento padrão.

    • 4
  3. user10489
    2024-08-02T12:25:07+08:002024-08-02T12:25:07+08:00

    EPIPE é um erro de gravação dentro da banda que ocorre no desligamento ordenado do canal. O processo normalmente não morre com isso e continua, esperançosamente depois de lidar com o erro e antes de tentar gravar mais dados. Se ele ignorar o erro em vez de tratá-lo e continuar gravando no canal de desligamento, ele receberá um SIGPIPE e morrerá.

    Além disso, SIGPIPE é, como você diz, um sinal assíncrono que normalmente ocorre quando o tubo é encerrado repentinamente sem um desligamento completo. Por exemplo, se o processo na outra extremidade do tubo sair sem ler os dados já em andamento, após a gravação desses dados já ter retornado. Se o SIGPIPE não estiver preso, normalmente faz com que o processo de recebimento seja eliminado.

    Um caso de uso típico seria um processo que gera dados que são enviados para menos. Se você pressionar qmenos, o processo de geração obterá um SIGPIPE.

    $ strace yes | less
    :write(1, "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"..., 8192) = 8192
    [...]
    ) = -1 EPIPE (Broken pipe)
    --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=1532747, si_uid=500} ---
    +++ killed by SIGPIPE +++
    
    • -2

relate perguntas

  • Como canalizar um 'sim' ou 'y' em um programa enquanto é invocado com 'sudo' no bash?

  • Passe o identificador para o pipeline stdin down

  • Como canalizar um comando bash e manter Ctrl + C funcionando?

  • Por que canalizar `mysql` para 'tail' altera o formato de saída?

  • ordem de substituição de processos `te` e `bash`

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