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 / ubuntu / Perguntas / 1537124
Accepted
Yakog
Yakog
Asked: 2025-01-04 02:15:02 +0800 CST2025-01-04 02:15:02 +0800 CST 2025-01-04 02:15:02 +0800 CST

Por que "cat" às vezes pula bytes ao ler de outro terminal, mas a função de varredura golang não?

  • 772

Uma pergunta relacionada aos pty-s (pseudo-terminais) e à maneira como (cat) golang os lê.

Primeiro, fiz o seguinte.

  1. abra dois terminais ( dev/pts/0- 0 e dev/pts/1- 1)
  2. então eu digito no segundo terminal "cat dev/pts/0" (então o que estiver escrito no primeiro terminal será exibido no segundo)
  3. comece a escrever no primeiro terminal (TUI)

Geralmente funciona na maior parte do tempo, mas alguns caracteres são pulados de vez em quando.

Mais precisamente, para aqueles caracteres que não são exibidos no segundo terminal, eu tenho echo, enquanto para aqueles que são exibidos, eu não tenho. É como se echo e cat estivessem competindo por caracteres.

Entretanto, quando trabalho com as funções de varredura golang e fmt, sempre que escrevo algo no terminal (e, portanto, no /dev/pts/0terminal), a função de varredura lê tudo (nenhum byte faltando) + o conteúdo inserido é exibido na TUI ("echo" funciona neste caso).

package main

import "fmt"

func main() {
    var input string

    fmt.Println("Enter text:")

    for {
        fmt.Scanln(&input)
        fmt.Println("You wrote:", input)
    }
}

Portanto, neste caso, parece que não existe "competição" entre echo e golang...

Espero o mesmo comportamento em ambos os casos. Em particular, ler todos os bytes em ambos os casos e ter (ou não ter) um eco em ambos os casos.

Qual é a diferença? Por que "cat" às vezes pula bytes ao ler de outro terminal, mas a função de varredura golang não? Eu pensei que o golang apenas lê de "dev/pts/0" da mesma forma que "cat" faz e apenas dá o resultado.

gnome-terminal
  • 1 1 respostas
  • 111 Views

1 respostas

  • Voted
  1. Best Answer
    egmont
    2025-01-04T19:06:42+08:002025-01-04T19:06:42+08:00

    Eu posso reproduzir a "competição" com o gocódigo também. Você não nos mostrou exatamente o que você faz lá, eu fiz um go run test.go < /dev/pts/0no terminal 1 e então digitei no terminal 0. Eu acho que você simplesmente não teve "sorte" o suficiente com o tempo aleatório.

    Existem dois leitores de /dev/pts/0. Um é seu shell rodando no terminal 0, esperando você digitar o próximo comando, como se ele fizesse isso se você não tentasse sequestrar sua entrada. O outro é catou gono terminal 1. É absolutamente indeterminístico qual deles será o mais rápido a notar um novo caractere disponível. Este é inerentemente o caso sempre que dois leitores tentam simultaneamente ler de um fluxo de bytes (pipe, socket, terminal).

    Você pode tentar executar um sleep infno terminal 0, dessa forma haverá apenas um leitor: seu cator go(porque sleepnão está lendo sua entrada). No entanto, suas configurações de terminal (modo raw vs. cooked) serão diferentes (seu shell alterna antes/depois de executar cada comando), portanto, você notará um comportamento de buffer de linha em vez de um baseado em caracteres, a edição de linha acontecerá no terminal 0 (isso é feito pelo kernel antes que qualquer um desses dados seja disponibilizado para o aplicativo leitor) e então a linha completa será lida pelo aplicativo em execução no terminal 1.

    Não sei o motivo de você estar fazendo esse experimento, mas se precisar separar a entrada e a saída em dois terminais diferentes, recomendo redirecionar a saída para um terminal externo, em vez da entrada.

    • 0

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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