
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 stderr
nã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 ttymon
ou, em sistemas mais antigos, getty
no 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/tty
dispositivo 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/tty
já 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>&3
trocas 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 Bercotredirfd
ferramenta, 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
stderr
destina-se à escrita e não à leitura. Às vezes é um dup
problema 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 stdout
para um arquivo e stderr
para ./myprograms
's stdin
.
command 2>&1 >a_file | ./myprogram
Responder3
Com shells como bash
e 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 stderr
assim, 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.