A saída de piping do python para o programa resulta em loop infinito

0

Eu tenho um programa que lê a entrada do usuário e depois imprime a localização da memória onde a entrada é armazenada na memória. Em seguida, pergunta se os usuários desejam continuar. Quando "Y" é inserido, o programa aguarda novamente a entrada do usuário. Se "N" for inserido, o programa sai. Aqui está uma amostra de como o programa funciona.

Give me data to dump:
ABCD
0xbeb9eaf8:  41 42 43 44
Dump again (y/n):
y
Give me data to dump:
ADDD
0xbeb9eaf8:  41 44 44 44
Dump again (y/n):
n

Quando tento alimentar a saída python no programa usando o comando

 echo 'python -c 'print "A"'' | ./program

Isso resulta em um loop infinito como este:

Give me data to dump:
0xbeb31af8:  41
Dump again (y/n):
Give me data to dump:
0xbeb31af8:  41
Dump again (y/n):
Give me data to dump:
0xbeb31af8:  41
Dump again (y/n):
Give me data to dump:
0xbeb31af8:  41
Dump again (y/n):
Give me data to dump:
0xbeb31af8:  41
Dump again (y/n):
Give me data to dump:
0xbeb31af8:  41
Dump again (y/n):
Give me data to dump:
0xbeb31af8:  41

Como canalizar a saída do python para o programa para que esse loop infinito não ocorra? A arquitetura é braço.

    
por Lew Wei Hao 20.02.2018 / 08:28

1 resposta

0

Sem ver o código, isso é conjectura, mas ...

O programa que faz a leitura provavelmente tem código que tenta ler de stdin com muito do equivalente a try / catch blocks (pseudo-código baseado em C #):

string memoryLocationToDisplay;
while(true) {
  try {
    Console.Write("Give me data to dump: ")
    string input = Console.ReadLine();
    if (IsValidMemoryLocation(input)) {
      memoryLocationToDisplay = input;
    }
  catch {}
  PrintMemoryLocation(memoryLocationToDisplay)

  try {
    Console.Write("Dump again (y/n): ")
    if Console.ReadLine().ToLower() == "n" {
      exit;
    }
  } catch {}
}

No entanto, o único caractere que o programa está lendo é ^ d (End of File), que funcionalmente resulta em um loop infinito com a mesma localização de memória sendo impressa para sempre.

Este é um bug no programa que faz a leitura, mas é provavelmente fácil de resolver:

printf "A\nn\n" | ./program

o bit printf será impresso

A<newline>
n<newline>

que então é canalizado através do programa, então agora ele vê o 'n' e uma nova linha, então deve sair.

    
por 25.03.2018 / 04:50