사용자로부터 입력을 읽은 다음 입력이 메모리에 저장된 메모리 위치를 인쇄하는 프로그램이 있습니다. 그런 다음 사용자에게 계속할 것인지 묻습니다. "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 출력을 프로그램으로 파이프하는 방법은 무엇입니까? 아키텍처는 팔이다.
답변1
코드를 보지 않고는 추측이지만...
읽기 작업을 수행하는 프로그램에는 다수의 동등한 try/catch 블록(C# 기반 의사 코드)을 사용하여 stdin에서 읽기를 시도하는 코드가 있을 수 있습니다.
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"과 개행 문자를 확인하여 종료해야 합니다.