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 / 464858
Accepted
z.h.
z.h.
Asked: 2018-08-26 16:43:54 +0800 CST2018-08-26 16:43:54 +0800 CST 2018-08-26 16:43:54 +0800 CST

passe stdout fd para 'ler' a chamada do sistema, mas ainda funciona bem [duplicado]

  • 772
Essa pergunta já tem respostas aqui :
Como (e por que) usar stderr para leitura e escrita? (2 respostas)
Todos os fluxos padrão operam no mesmo arquivo (/dev/tty)? (1 resposta)
Fechado há 4 anos .

Eu passo 1(stdout)/ 2(stderr) para a readchamada do sistema, mas ainda funciona bem. Então eu passo 0(stdin) para a writechamada do sistema e descubro que funciona também!

int main(int argc, char** argv){
    char buf[1024] = "abcdefghi\n";

    write(0, buf, 10);

    char readbuf[1024] = {0};
    // read(1, readbuf, 10); works too
    read(2, readbuf, 10);
    write(2, readbuf, 10);

    return 0;
}

resultado:

abcdefghi
hey stdin  <-- I input this
hey stdin

Confuso, pensei que deveria ser um erro.

Experiência:

Então eu tentei redirecionar fd 2.

$ ./a.out 2>/dev/null

desta vez, tanto a leitura quanto a segunda gravação não são 'visíveis'. A saída é

abcdefgi

Então o stderr pode ser usado para leitura?

Eu então fecho o stdout & stderr e faço duas cópias do stdin:

int main(int argc, char** argv){
    char buf[1024] = "abcdefghi\n";

    close(1);
    close(2);

    dup2(0, 1);
    dup2(0, 2);

    write(0, buf, 10);

    char redbuf[1024] = {0};
    read(2, redbuf, 10);
    write(2, redbuf, 10);

    return 0;
}

Novamente funciona.

resultado:

abcdefghi
hey stdin  <-- I input this
hey stdin

Então stdin pode ser usado para escrever?

Preciso de uma explicação aqui.

Pergunta

Eu quero saber:

Por que stdout/stderr pode ser usado para leitura?

Por que stdin pode ser usado para gravação?

Os três fluxos ( stdin,stdout,stderr ) são internamente um fluxo?

Se não, por que estou obtendo esse resultado?

file-descriptors system-calls
  • 2 2 respostas
  • 2181 Views

2 respostas

  • Voted
  1. Best Answer
    RalfFriedl
    2018-08-26T23:18:27+08:002018-08-26T23:18:27+08:00

    É apenas convenção usar fd 0/1/2 para entrada/saída/erro. Se você chamar um programa sem redirecionamento, todos os três se referem ao seu tty e seu tty é aberto com acesso de leitura e gravação. Isso significa que você pode ler ou escrever para eles como quiser. Você pode chamá-los de mesmo fluxo, embora o fluxo de expressão seja frequentemente usado para E/S de nível mais alto, como FILEem C ou streamem C++.

    Esta é a razão pela qual ambos os exemplos redirecionados ou não apenas ecoam o texto que você digita.

    Por outro lado, se você fizer o redirecionamento, o shell abrirá os arquivos com acesso somente leitura ou somente gravação. No seu exemplo ./a.out 2>/dev/null, o write to 0ainda está conectado ao terminal porque não é redirecionado e, portanto, é exibido na tela. A leitura de 2está conectada apenas a uma gravação /dev/nulle, portanto, deve falhar, mas você não notaria a diferença do seu programa. A gravação para é bem- 2sucedida, mas é gravada para /dev/null. A leitura inválida e a gravação válida /dev/nullnão são visíveis no seu terminal.

    • 1
  2. schily
    2018-08-27T06:06:31+08:002018-08-27T06:06:31+08:00

    Desde que você não tenha redirecionado stdin/stdout/stderr, esses descritores de arquivo foram abertos pelo procedimento de login e isso abre o relacionado ttypara leitura e gravação como o primeiro arquivo (resultando no descritor de arquivo #0) e depois chama dup()2 vezes para obter os descritores de arquivo para stdout e stderr.

    Como mencionado em Como `less` pega dados de stdin enquanto ainda consegue ler comandos do usuário? em tempos antigos (antes /dev/ttyde ter sido apresentado a UNIX) programas como moreo did read stderrquando pedia confirmação.

    • -1

relate perguntas

  • Compartilhamento de descritores de arquivo

  • Por que os descritores de arquivo são compartilhados entre processos bifurcados?

  • O uso da função system () dentro do código C ++ é uma maneira rápida de usar códigos-fonte? [fechado]

  • bit de modo kernel

  • Necessidade de algumas chamadas de sistema

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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