cat into stdin, em seguida, pipe no programa mantém shell bifurcado aberto, por quê?

2

Não sei o que está acontecendo, mas estou tentando entender o que está acontecendo com a entrada e a saída. Então aqui está o meu programa.

#include <stdio.h>
#include <stdlib.h>
int main(){
    char pass[8];
    fgets(pass, 8, stdin);
    if (pass[1] == 'h'){
        printf("enter shell\n");
        system("/bin/bash");
        printf("leave shell\n");
    }
    return 0;
}

E aqui estão alguns comandos do terminal. Quando eu corro regularmente, e introduzo 'hh', o shell fica aberto.

idkanything ~ $ ./a.out
hh
enter shell
bash-3.2$

Agora eu tento ecoar no pipe, mas o shell é fechado imediatamente.

idkanything ~ $ echo "hh" | ./a.out
enter shell
leave shell

Então, agora aqui está quando funciona:

idkanything ~ $ cat <(python -c 'print "hh"') - | ./a.out
enter shell
this work
/bin/bash: line 1: this: command not found
leave shell

Mas quando eu deixo de fora o '-' para stdin, ele não funciona como no shell fecha imediatamente.

idkanything ~ $ cat <(python -c 'print "hh"') | ./a.out
enter shell
leave shell

Quando eu tenho gato no final aqui, também funciona.

idkanything ~ $ (python -c 'print "hh"'; cat) | ./a.out
enter shell
this works
/bin/bash: line 1: this: command not found
leave shell

Alguém por favor pode explicar o que está acontecendo? O que especificamente sobre os comandos que funcionam faz com que o shell permaneça aberto? Por que o shell fica apenas aberto para esses comandos e não para os outros comandos, como "hh" e, em seguida, canalizando isso para dentro.

Eu acredito que pode ter algo a ver com stdout.

    
por whoami 22.07.2016 / 10:44

1 resposta

3

Para os casos em que "funciona", você está deixando um processo executando cat que está lendo a entrada padrão its , que não foi fechada. Como isso não é (ainda) fechado, cat continua a ser executado, deixando a saída padrão its aberta, que é usada pelo shell (também não fechado).

    
por 22.07.2016 / 10:53