O descritor de arquivo 2 está aberto para leitura e gravação

O descritor de arquivo 2 está aberto para leitura e gravação

Este é o meu programa c lido em stderr que escrevo

#include <uninstd.h>
#include <stdio.h>

int main(void) {
 char buff[3];
 read(2, buff, sizeof(buff));
 printf("%s", buff");
 return 0;
}

Minha pergunta, como posso enviar um stderr para ele. A maior parte da pesquisa aparece no redirecionamento bash

command 2> file

Mas isso envia o stderr para um arquivo.

Como posso passar para o meu programa. Como pip,

command 2 "somthing here" ./myprogram

Obrigado pelas respostas.

Responder1

É uma surpresa para muitas pessoas, dado que a maioria dos livros de referência e documentação sempre se referem ao erro padrão como saída, que na verdade é normalmentejá aberto para leitura+gravação. Seu programa muitopodeleia do descritor de arquivo 2.

(Nota: nesta resposta estou usando os números reais do descritor de arquivo. OFluxos Ctais como stderrnão precisam realmente corresponder a esses descritores de arquivo, pois um programa pode alterá-los, e isso adiciona uma camada de confusão ao falar sobre o que os fluxos C fazem. Seu programa está usando read().)

O descritor de arquivo 2 está aberto para leitura e gravação

Para programas em sessões de login onde nenhum redirecionamento foi usado em um processo pai, o descritor de arquivo 2 (erro padrão) normalmente é uma duplicata do descritor de arquivo 0 (entrada padrão). Ambos fazem referência ao mesmo subjacenteDescrição do arquivo, que normalmente é o terminal da sessão de login (aberto e duplicado por ttymonou, em sistemas mais antigos, gettyno início da sessão).

Se você ler a partir do descritor de arquivo 2, obterá a mesma entrada como se tivesse lido a partir do descritor de arquivo 0.

BTW: A leitura do descritor de arquivo 2 era feita frequentemente para coisas como entrada de senha; antes do /dev/ttydispositivo ser introduzido, por volta de 1977. O motivo da leitura do descritor de arquivo 2 era obter entrada do terminal original quando o descritor de arquivo 0 havia sido redirecionado para outro lugar (como é o caso no meio de um pipeline, por exemplo).

Embora /dev/ttyjá esteja disponível há muito tempo, há mais de 40 anos, o POSIX ainda exige que o descritor de arquivo 2 também esteja aberto para leitura.

O que seu programa não está fazendo

Ler a saída do descritor de arquivo 2 de outro programa é uma coisa diferente. Você não pode fazer isso facilmentepor si próprio, sem mesclar a saída padrão com o erro padrão. Geralmente envolve uma série de 3>&1 1>&2 2>&3trocas ou similares. Alguns shells permitem canais no descritor de arquivo de saída 2 chamando

prog1 2| prog2

Mas tais conchas são raras, e não é isso queseunecessidades do programa em qualquer caso.

Enviando entrada para o seu programa

Se você deseja que seu programa, lendo o descritor de arquivo 2, leia algooutrodo que no terminal, é claro que você redireciona esse descritor de arquivo. Vocêpoderiause o normalentradasintaxe de redirecionamento (o <operador no shell), mas as bibliotecas do seu programa, ou mesmo outro código que você escreveu em outro lugar, terão suposições de que podem gravar neste descritor de arquivo.

O shell permite que você use o <>operador de redirecionamento que abre explicitamente um arquivo para leitura e gravação. Isto é o que você usa ao redirecionar o descritor de arquivo 2 do seu programa.

./myprogram 2<>filename

Fora o redirecionamento de shell, existem muitas ferramentas que permitem a manipulação de descritores de arquivos. Por exemplo: Com o carregamento em cadeia de Laurent Bercotredirfdferramenta, que vem com o execline, esse redirecionamento se parece mais com a sua hipótese:

redirfd -u 2 filename ./myprogram

Há também sintaxe de shell como os shells Bourne Again e Z (mas não os shells Almquist) para fornecer "documentos aqui" e "strings aqui" para o descritor de arquivo 2. Observe que o descritor de arquivo 2 é abertosomente leiturapor essas conchas neste caso.

./myprogram 2<<< "here string"

Responder2

stderrdestina-se à escrita e não à leitura. Às vezes é um dupproblema stdin(por exemplo, quando todas as 3 entradas/saídas/erros estão conectadas ao terminal). Para ler o stderr de outro programa, você redireciona o stderr desse programa para o stdin de outro.

por exemplo, to direciona stdoutpara um arquivo e stderrpara ./myprograms's stdin.

command 2>&1 >a_file | ./myprogram

Responder3

Com shells como bashe zsh(mas não POSIX simples sh), você pode redirecionar o erro padrão de um programa para a entrada padrão de outro programa via firstprogram 2> >(second program).

Exemplo:

$ perl -E 'say "perl stdout"; warn "perl stderr\n"' 2> >(awk '{print "awk", $0}')
perl stdout
awk perl stderr

Responder4

Para que o shell configure um redirecionamento de entrada para stderr, você usaria <, <<ou <<<e prefixaria o número do descritor de arquivo:

./myprog 2< somefile.txt

ou

./myprog 2<<< "some text"

Embora se você redirecionar stderrassim, o programa não poderásaídapara ele, o que significa que você não verá nenhuma mensagem de erro que o programa (ou qualquer biblioteca que ele use) possa tentar imprimir e, além disso, o programa receberá erros ao tentar escrever essas mensagens.

Você pode querer reconsiderar se haveria alguma outra maneira de fazer o que quer que esteja fazendo. No mínimo, considere usar, por exemplo, fd 3 se a ideia for fornecer alguma entrada para o programa.

informação relacionada