我有一个程序,它读取用户的输入,然后打印出输入在内存中存储的内存位置。然后它询问用户是否希望继续。当输入“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”和换行符,因此它应该退出。