Redirecionamento de saída do programa

11

Ao tentar redirecionar a saída do programa com a sintaxe "some number greater than" (por exemplo, foo 2> myfile ), quais são os números possíveis aqui e o que eles representam?

Eu acredito que 1 é /dev/stdout , 2 é /dev/stderr . O que dizer de 5 & 6? Existe 3, 4 ou algum número maior que 6?

    
por Will 13.10.2015 / 16:20

4 respostas

11

Este suposto programa gravará no número do descritor de arquivo que você especificou. considere o seguinte programa hello world:

#include <stdio.h>

main()
{
   ssize_t i = 0 ;
   printf ("hello world\n") ;
   i = write( 5 , "Bonjour Monde\n", 14 ) ;
   printf ("%d octet dans 5\n", (int) i) ;
}

compila

me@mybox:~/tmp7$ make hw
cc     hw.c   -o hw

agora uma corrida simples

me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5

nenhum arquivo para 5, então nenhum byte escreveu.

próxima tentativa:

me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde

Consigo obter uma saída ao especificar um arquivo e um descritor de arquivo (por exemplo, 5>u ).

Na prática, a menos que você tenha escrito um programa tão divertido como o acima, é improvável que você colete dados usando 5>foo .

no shell script, construir usando < () é mais útil:

 diff <( cmd -par 1 ) <(cmd -par 2)
    
por 13.10.2015 / 16:46
10

Os números representam os descritores de arquivos (identificadores dos arquivos que foram abertos).

O shell geralmente tem 3 conjuntos automaticamente,

0 - stdin 1 - stdout 2 - stderr

Mas mais arquivos podem ser abertos e os números aumentam.

    
por 13.10.2015 / 16:28
7

Esses números são descritores de arquivos . Como você observou, existem vários que são criados automaticamente. À medida que outros arquivos ou arquivos forem abertos, eles receberão outros números.

Os números que são usados em qualquer programa específico dependem de quais arquivos foram abertos por esse programa ou de outra forma usados. Por exemplo, se você quiser "salvar" o stdin atual e redirecionar temporariamente o stdin de outro lugar e depois restaurá-lo mais tarde, você pode fazer algo como:

exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate

Portanto, esse script teria um descritor de arquivo 4 disponível pelo menos por algum tempo. Esse 4 pode ser qualquer coisa que não esteja em uso (bem, há um limite para quantos arquivos um processo pode ter aberto, mas qualquer coisa dentro desse limite).

Você pode ver quais descritores de arquivos um processo abriu e onde eles estão abertos, pesquisando em /proc/<pid>/fd . Isso mostra todos os descritores de arquivos abertos para esse processo <pid> e quais arquivos estão associados.

    
por 13.10.2015 / 16:36
0

Qualquer processo obtém números inteiros como descritores de arquivos, onde há três reservados no POSIX: 0 é stdin, 1 é stdout e 2 é stderr. Quaisquer arquivos adicionais serão atribuídos a outros números. Você pode verificá-lo facilmente com este programa, salve-o como fdtest.c , para que ele abra seu próprio código de programa durante o tempo de execução:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd = open("fdtest.c", O_RDONLY);
    printf("%d\n", fd);
    close(fd);
    return 0;
}

Compile:

gcc fdtest.c -o fdtest

Execute:

./fdtest

A saída que você terá é algo assim:

3

... que é o número do descritor de arquivo do arquivo referido pela variável fd .

    
por 13.10.2015 / 21:14