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出力をプログラムにパイプする方法は?アーキテクチャは腕です。

ベストアンサー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」と改行文字を確認して終了する必要があります。

おすすめ記事