O que é um “cachimbo” e como pode ser “quebrado”?

12

Eurecebioerro"broken pipe" do Xcode uma vez demais. Agora estou curioso para saber exatamente o que é um tubo.

Qual é o conceito de um "pipe" e como ele pode ser "quebrado"?

    
por Moshe 20.06.2011 / 06:16

5 respostas

7

Um pipe é simplesmente um mecanismo de comunicação entre processos (IPC) usado para conectar a saída padrão de um processo à entrada padrão de outro.

Um exemplo é quando você deseja pesquisar um arquivo pela palavra "pax":

cat filename | grep pax

e sim, eu sei que você pode grep o arquivo diretamente, mas isso não explica como funciona, não é?

Isso conecta a saída padrão do comando cat à entrada padrão do comando grep . cat envia o conteúdo do arquivo para sua saída padrão e grep lê seu arquivo (neste caso) de sua entrada padrão. Ao conectar processos juntos dessa maneira, você pode criar suas próprias ferramentas, consistindo em qualquer número de segmentos de tubos. Coisas como:

show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20

Um canal quebrado é aquele em que (normalmente) o receptor dos dados fechou a conexão enquanto o remetente ainda está tentando enviar coisas.

Por exemplo, se você enviar um arquivo grande por meio de um programa de pager (para visualizá-lo uma página por vez):

cat myfile | pager

e, em seguida, faça um CTRL-BREAK , isso pode fazer com que o processo pager encerre seu canal de entrada antes que cat tenha terminado de usá-lo. Essa é uma possibilidade para conseguir esse cano quebrado.

De um pesquisa do Google superficial, esse problema em particular parece estar relacionado a implementações ad hoc e as soluções fornecidas geralmente incluem a maioria dos seus programas e a reinicialização da maioria dos seus dispositivos.

Isso provavelmente é grave o suficiente para relatar o problema à Apple. Quanto mais desenvolvedores reclamarem, mais provavelmente algo será feito para corrigi-lo.

    
por 20.06.2011 / 06:21
2

O caractere | é geralmente chamado de pipe. Nos vários shells do UNIX (que eu conheço) ele pode ser usado para canalizar a saída de um comando para a entrada de outro.

cat myfile.txt | head

O comando head mostra apenas as primeiras linhas de sua entrada. Nesse momento, fecha sua entrada. Isso representa um problema para o comando que estava gerando a entrada. Onde ele escreve? Sempre que temos essa situação, ou a situação em que o processo de composição termina antes de o leitor terminar, é chamado de "cano quebrado".

Para evitar que o comando cat permaneça para sempre, o padrão UNIX define um sinal especial ( SIGPIPE , sinal 13 ) que ele envia para% código%. A ação padrão para este sinal é matar o processo, o que faz com que o cat termine bem.

Parece que o aplicativo que você está usando instalou um manipulador de sinal para todos os sinais, incluindo o SIGPIPE, que cria a pequena mensagem pop-up que você vê.

    
por 20.06.2011 / 06:36
1

Esse erro parece surgir com bastante frequência. link é "... um erro interno na capacidade do Xcode de falar com o seu telefone. Isso não significa que você tenha feito algo errado, é um bug no sistema de desenvolvimento"

    
por 20.06.2011 / 06:32
1

Um pipe é um mecanismo IPC em sistemas Unix. Um pipe tem duas extremidades, uma final de leitura e uma final de gravação. Os dados gravados no final da gravação podem ser lidos no final da leitura e saem na ordem em que foram gravados.

No mundo da linha de comando Unix, pipes são uma forma muito comum de conectar programas para fazer um trabalho. Por exemplo, sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz' lerá no arquivo fred.txt substituirá todas as instâncias da string foo pela string bar e pesquisará o resultado por linhas que contenham bar seguido por algum número de caracteres e, em seguida, baz .

Isso, claro, não parece muito útil. Mas tenho certeza de que, se pensar sobre isso, você pode ver como você pode colocar isso em todos os tipos de usos interessantes, especialmente quando tiver programas como awk ou perl à sua disposição.

O sistema de pipe faz parte do Unix desde muito cedo. E se um processo em seu pipeline sair, você geralmente deseja que todos os programas no pipeline sejam encerrados. Isso significa que, por padrão, um processo que grava em um pipe quando o processo no final da leitura desaparece receberá um sinal SIGPIPE . E se bloquear esse sinal, o write ainda falhará com um tipo especial de erro indicando que o canal foi "quebrado".

O tratamento padrão de SIGPIPE mata o processo que o recebe. E se não for a "cabeça" do pipeline, toda a coisa SIGPIPE se propaga pela cadeia.

O que o Xcode está reclamando é que ele iniciou algum subprograma para fazer algo com um pipe que o levasse, e esse subprograma morreu inesperadamente deixando o tubo quebrado.

    
por 20.06.2011 / 07:06
0

Um canal "quebrado" é aquele em que uma extremidade foi close() 'd e a outra está sendo lida ou gravada. Por exemplo, no seguinte comando shell:

cat foo | less

O processo cat mantém a extremidade de gravação do canal e o less processa o de leitura. Se o processo do leitor fechar o tubo, o tubo está quebrado (e, portanto, inútil); o processo do gravador receberá o erro “broken pipe” do sistema operacional.

    
por 20.06.2011 / 06:32