usando argumento de linha de comando com redirecionamento

0
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
        int val;

        if(argc!=2)
        {
                printf("Usage: %s <descriptor> \n", argv[0]);
                exit(1);
        }

        val=fcntl(atoi(argv[1]), F_GETFL, 0);


        switch(val & O_ACCMODE)
        {
                case O_RDONLY:
                        printf("read only");
                        break;
                case O_WRONLY:
                        printf("write only");
                        break;
                case O_RDWR:
                        printf("read write");
                        break;
                default:
                        printf("unknown access mode");
        }

        if(val & O_APPEND)
                printf(", append");
        if(val & O_NONBLOCK)
                printf(", nonblocking");
        if(val & O_SYNC)
                printf(", synchronous writes");

        putchar('\n');
        exit(0);
 }

Eu tenho esse código. De qualquer forma, a fonte é totalmente compreensível.

Mas, fiquei confuso ao usar este programa com argumento de linha de comando com redirecionamento.

usando este programa e o resultado está seguindo

    $ ./a.out 0 < /dev/tty
    read only
    $ ./a.out 1 > temp.foo
    $ cat temp.foo
    write only
    $ ./a.out 2 2>>temp.foo
    write only, append
    $ ./a.out 5 5<>temp.foo
    read write

Eu sei como redirecionar, mas usar essa técnica com argumento de linha de comando é muito confuso. Não sei de nada.

Bem, no meu conhecimento, este programa recebe 1 argumento que é o número do descritor de arquivo.

Então, quando eu uso este programa como

$ ./a.out 0
read write
$ ./a.out 1
read write
$ ./a.out 2
read write

Está tudo bem. stdin, stdout, status do arquivo stderr é read write .

Mas quando eu uso este comando com redirecionamento. Eu não sei o que o mecanismo está fazendo.

Por exemplo:

./a.out 0 < /dev/tty

Aqui, /dev/tty file é agora igual à entrada padrão, então 0 significa /dev/tty depois de tudo?

E qual é a diferença entre &2 , &1 e 2 , 1 quando usamos o redirecionamento?

    
por A.Cho 01.03.2016 / 06:08

1 resposta

3

I know how to do redirecting, but using this technique with command line argument is so confusing. I don't know anything.

Por favor, descreva mais detalhadamente o que exatamente confunde você. Quanto a mim, os resultados são muito esperados: se um objeto de arquivo é aberto para somente leitura (como faz o redirecionamento '<'), o F_GETFL fornecerá O_RDONLY. O mesmo para outros tipos de redirecionamentos.

Sem redirecionamento, um comando filho recebe os mesmos descritores padrão que o pai deve ter. Em um caso interativo típico, é o terminal do usuário e todos os descritores estão em leitura-gravação. Decidiu-se inútil torná-los somente leitura, somente gravação, etc., porque é mais conveniente usar o mesmo descritor para atividade de terminal interativo (como, por exemplo, atividade de tela cheia com curses ), do que dividi-lo entre 0 para terminal entrada, 1 para saída de terminal, etc .; mas isso não é estendido para redirecionamentos especificados pelo usuário. Foi isso que você perguntou?

And, what's the difference between &2 ,&1 and 2, 1 when we use redirecting?

Se você quer dizer formulários como 2>1 e 2>&1 , eles são principalmente diferentes. 2>1 redireciona 2 como gravando no arquivo 1 . 2>&1 redireciona 2 como cópia do descritor 1 (no nível C, isso é dup2(1,2) ). Tanto n<&m como n>&m para o numérico n, m são idênticos e não adicionam restrições ao modo de acesso.

    
por 01.03.2016 / 08:30