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.