从 python 到程序的管道输出会导致无限循环

从 python 到程序的管道输出会导致无限循环

我有一个程序,它读取用户的输入,然后打印出输入在内存中存储的内存位置。然后它询问用户是否希望继续。当输入“Y”时,程序再次等待用户输入。如果输入“N”,则程序退出。以下是该程序如何工作的示例。

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

当我尝试将 python 输出输入程序而不是使用命令时

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

它会导致无限循环,如下所示:

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

如何将 python 输出通过管道传输到程序,以免发生无限循环?架构是arm。

答案1

没有看到代码,这是猜测,但是......

执行读取操作的程序可能具有尝试从 stdin 读取的代码,其中包含许多等效的 try/catch 块(基于 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 {}
}

然而,程序读取的唯一字符是 ^d(文件结尾),这在功能上会导致无限循环,并永远打印出相同的内存位置。

这是执行读取的程序中的一个错误,但可能很容易解决:

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

printf 位将打印出来

A<newline>
n<newline>

然后通过程序进行管道传输,因此它现在看到“n”和换行符,因此它应该退出。

相关内容